【问题标题】:Align secondary percentage y axis with primary y axis in Plotly将次要百分比 y 轴与 Plotly 中的主要 y 轴对齐
【发布时间】:2022-01-03 13:23:30
【问题描述】:

我正在使用 Plotly 创建一个图形,在主 y 轴上有两条线,在辅助 y 轴上有一个条形图,显示 line2/line1 的比例。

代码运行良好,但创建了太多参考线(左轴的 1000、2000、3000... 和右轴的 1%、2%、3%... 的线) .

是否可以对齐它们?例如,1000 和 1% 将共享相同的参考线,或者它始终对齐左右轴的任何其他方式。

这是代码和生成的图表:

    fig = make_subplots(specs=[[{'secondary_y': True}]])
    
    fig.add_trace(go.Scatter(x=data['date'], y=data['y1'],
                    mode='lines+markers',
                    name='Y1'), secondary_y=False)
    
    fig.add_trace(go.Scatter(x=data['date'], y=data['y2'],
                    mode='lines+markers',
                    name='Y2'), secondary_y=False)
    
    fig.add_trace(go.Bar(x=data['date'], y=data['pct'],
                    name='PCT', opacity=0.5), secondary_y=True)
    
    fig.update_layout(title=f'Graph', yaxis2=dict(tickformat='.2%'))

【问题讨论】:

  • 我环顾四周,但找不到对齐主要和次要 y 轴网格的方法。一个不情愿的解决方案是隐藏辅助 y 轴的网格。请参考this answerfig.layout.yaxis2.showgrid=False

标签: python plotly plotly-python


【解决方案1】:

我能够通过将两个轴范围模式设置为零然后更改比例比例来使其工作,以便 1k 与 1% 对齐,2k 与 2% 对齐,依此类推

fig.update_yaxes(rangemode='tozero', scaleanchor='y', scaleratio=1, constraintoward='bottom', secondary_y=True)
fig.update_yaxes(rangemode='tozero', scaleanchor='y2', scaleratio=0.00001, constraintoward='bottom', secondary_y=False)
    

【讨论】:

    【解决方案2】:

    一种方法是确保两个 y 轴具有相同的刻度数,并且每个刻度之间的相对空间相等。下面是一个例子:

    fig.update_layout(yaxis1_tickvals = [40, 70, 100], yaxis2_tickvals = [4, 4.5, 5])
    

    情节1:

    如果没有添加,下面的代码示例将产生以下图:

    情节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, 100], name="yaxis data"),
        secondary_y=False,
    )
    
    fig.add_trace(
        go.Scatter(x=[2, 3, 4], y=[4, 5, 4], 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.update_layout(yaxis1_tickvals = [40, 70, 100], yaxis2_tickvals = [4, 4.5, 5])
    
    fig.show()
    

    【讨论】:

    • 感谢您的回复,韦斯特兰。我没有使用 tickval,而是通过更改两个轴的比例来使其工作,以将 1k 对齐到 1%、2k 到 2% 等
    • @eduardoftdo 我注意到了!非常好!
    猜你喜欢
    • 2021-12-02
    • 2020-12-10
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多