在 Plotly 中将次要百分比 y 轴与主要 y 轴对齐

Align secondary percentage y axis with primary y axis in Plotly

我正在使用 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 轴具有相同数量的刻度,并且每个刻度之间的相对 space 相等。这是一个示例:

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()

我能够通过将两个轴的范围模式设置为零然后更改比例使 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)