【问题标题】:using a loop to define multiple y axes in plotly使用循环在 plotly 中定义多个 y 轴
【发布时间】:2018-05-17 00:22:09
【问题描述】:

我必须在多个 y 轴上绘制线。然而,在 plotly 中,go.Layout 中的轴生成非常冗长,就像 plotly 文档中的这个示例一样: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()

由于对象生成中使用的 dict 语法,我似乎无法使类似的东西在情节上起作用。我已经尝试提前通过循环生成轴字典并将它们传递给go.Layout,但没有成功。 如果有人能指出一种减少冗余的优雅方法,将不胜感激。

一切顺利,提前致谢。

【问题讨论】:

    标签: python python-3.x plotly


    【解决方案1】:

    您可以利用 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)
    

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 2022-07-06
      • 2021-09-16
      • 2015-06-09
      • 2021-03-10
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多