在Plotly Python中添加第二个轴

8
我正在使用一个Dash图形对象,对此还比较陌生。我想传入一个图形,其中包含同一图中的两个散点图和一个条形图,但我希望条形图(绿色)在自己的次级y轴上,以便它看起来比现在更好:

enter image description here

我对Dash的理解是必须传递一个go.Figure()对象,因此我编写了一个函数来定义datalayout。我在plotly文档中看到可以使用plotly express添加次级轴,但我不确定如何在这里完成。非常感谢您的任何帮助!

以下是我的代码:

def update_running_graph(n_intervals):
    df = pd.read_csv(filename)

    trace1 = go.Scatter(x=df['Timestamp'],
                        y=df['CLE'],
                        name='Crude',
                        mode='lines+markers')
    trace2 = go.Scatter(x=df['Timestamp'],
                        y=df['y_pred'],
                        name='Model',
                        mode='lines+markers')
    trace3 = go.Bar(x=df['Timestamp'],
                    y=df['ModelDiff'],
                    name='Diff',
                    )
    data = [trace1, trace2,trace3]
    layout = go.Layout(title='CLE vs Model')
    return go.Figure(data=data, layout=layout)
2个回答

22

要在Dash中添加第二个y轴,可以按照以下步骤进行:

def update_running_graph(n_intervals):
    df = pd.read_csv(filename)

    trace1 = go.Scatter(x=df['Timestamp'],
                        y=df['CLE'],
                        name='Crude',
                        mode='lines+markers',
                        yaxis='y1')
    trace2 = go.Scatter(x=df['Timestamp'],
                        y=df['y_pred'],
                        name='Model',
                        mode='lines+markers',
                        yaxis='y1')
    trace3 = go.Bar(x=df['Timestamp'],
                    y=df['ModelDiff'],
                    name='Diff',
                    yaxis='y2'
                    )
    data = [trace1, trace2,trace3]
    layout = go.Layout(title='CLE vs Model',
                       yaxis=dict(title='Crude and Model'),
                       yaxis2=dict(title='Moddel Difference',
                                   overlaying='y',
                                   side='right'))
    return go.Figure(data=data, layout=layout)

您可以添加更多的y轴,它们始终需要采用yi的形式,其中i是第i个轴。然后在布局中,您可以使用yaxisi=dict(...)来指定第i个轴的布局。


这非常有帮助。设置非常直观。 - KobeJohn
这是最好的方法,文档应该包括这种看起来最适合且符合Plotly哲学的方法。我建议在两个y轴上都取消网格,因为它会导致显示混乱。只需将showgrid=False添加到两个y轴布局字典中即可。 - Boorhin

7

这个文档页面应该会很有用。只需根据您的代码进行修改,因为trace1和trace2似乎在同一比例尺上,只需将trace3设置为次要轴比例尺,您就可以完成了。下面是一个只有2个示例,但添加第三个不应该太困难。

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces
fig.add_trace(
    go.Scatter(x=[1, 2, 3], y=[40, 50, 60], name="yaxis data"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=[2, 3, 4], y=[4, 5, 6], name="yaxis2 data"),
    secondary_y=True,
)

# Add figure title
fig.update_layout(
    title_text="Double Y Axis Example"
)

# Set x-axis title
fig.update_xaxes(title_text="xaxis title")

# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b> yaxis title", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b> yaxis title", secondary_y=True)

fig.show()

干杯!


我一直收到以下错误:ValueError: plotly.subplots.make_subplots 只能在 v4_subplots plotly_future 模式下使用。要尝试它,请在导入 plotly 之前运行
from plotly_future import v4_subplots
- novawaly
我已经更新到版本4,但仍然无法工作。 - novawaly
1
如果您遇到了导入问题,您需要使用pipconda卸载plotly,然后再使用其中的一个重新安装。 - nicolaskruchten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接