используя цикл, чтобы определить несколько осей у в графически - PullRequest
0 голосов
/ 17 мая 2018

Мне нужно нанести линии на несколько осей Y. Тем не менее, в графике генерация оси в пределах go.Layout довольно многословна, как в этом примере из сюжетной документации: https://plot.ly/python/multiple-axes/

layout = go.Layout(
title='multiple y-axes example',
width=800,
xaxis=dict(
    domain=[0.3, 0.7]
),
yaxis=dict(
    title='yaxis title',
    titlefont=dict(
        color='#1f77b4'
    ),
    tickfont=dict(
        color='#1f77b4'
    )

## repeat for every new y-axis.

В matplotlib мне нравится сохранять код, генерируя все различные оси и обрабатывая графики в циклах следующим образом:

import matplotlib.pyplot as plt
import numpy as np

# generate dummy data
data = []
for i in range(5):
    arr = np.random.random(10) * i
    data.append(arr)

colors = ['black', 'red', 'blue', 'green', 'purple']
labels = ['label1', 'label2', 'label3', 'label4', 'label5']

# define other paramters (e.g. linestyle etc.) in lists

fig, ax_orig = plt.subplots(figsize=(10, 5))
for i, (arr, color, label) in enumerate(zip(data, colors, labels)):
    if i == 0:
        ax = ax_orig
    else:
        ax = ax_orig.twinx()
        ax.spines['right'].set_position(('outward', 50 * (i - 1)))
    ax.plot(arr, color=color, marker='o')
    ax.set_ylabel(label, color=color)
    ax.tick_params(axis='y', colors=color)
fig.tight_layout()
plt.show()

figure generated by example

Из-за синтаксиса dict, используемого при генерации объектов, мне кажется, что я не могу заставить что-то подобное работать в заговоре. Я пытался заранее генерировать оси осей с помощью циклов и передавать их на go.Layout, но безуспешно. Если кто-нибудь может указать элегантный способ уменьшить избыточность, он будет очень признателен.

Всего наилучшего и заранее спасибо.

1 Ответ

0 голосов
/ 18 мая 2018

Вы можете воспользоваться преимуществами Python **kwargs, то есть вы создаете словарь, который содержит все значения макета и передает его в макет Plotly.

import numpy as np
import plotly

plotly.offline.init_notebook_mode()

# generate dummy data, taken from question
data = []
for i in range(5):
    arr = np.random.random(10) * i
    data.append(arr)

labels = ['label1', 'label2', 'label3', 'label4', 'label5']

plotly_data = []
plotly_layout = plotly.graph_objs.Layout()

# your layout goes here
layout_kwargs = {'title': 'y-axes in loop',
                 'xaxis': {'domain': [0, 0.8]}}

for i, d in enumerate(data):
    # we define our layout keys by string concatenation
    # * (i > 0) is just to get rid of the if i > 0 statement
    axis_name = 'yaxis' + str(i + 1) * (i > 0)
    yaxis = 'y' + str(i + 1) * (i > 0)
    plotly_data.append(plotly.graph_objs.Scatter(y=d, 
                                                 name=labels[i]))
    layout_kwargs[axis_name] = {'range': [0, i + 0.1],
                                'position': 1 - i * 0.04}

    plotly_data[i]['yaxis'] = yaxis
    if i > 0:
        layout_kwargs[axis_name]['overlaying'] = 'y'

fig = plotly.graph_objs.Figure(data=plotly_data, layout=plotly.graph_objs.Layout(**layout_kwargs))
plotly.offline.iplot(fig)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...