You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly如何将双Y轴按不同值对齐?Y轴1零值对齐Y轴2的1值

在Plotly中实现双Y轴指定数值对齐

当然可以实现!要让主Y轴(yaxis1)的0值与次Y轴(yaxis2)的1值对齐,你可以通过手动计算两个Y轴的范围比例,确保对应数值在垂直方向处于同一水平线。以下是修改后的代码:

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

df = pd.DataFrame(dict(months=['jan','feb','mar','apr','may','jun'], 
                       assets = [60,20,-25,-35,20,80], 
                       liabilities = [70,75,80,90,70,50]))

# 计算资产负债比率
df['ratio'] = df['assets'] / df['liabilities']

# 创建带双Y轴的子图
fig = make_subplots(specs=[[{"secondary_y": True}]])    

# 添加各数据轨迹
fig.add_trace(go.Bar(x=df['months'], y=df['assets'], marker_color='green', name='资产'))
fig.add_trace(go.Bar(x=df['months'], y=df['liabilities'], marker_color='red', name='负债'))
fig.add_trace(go.Scatter(x=df['months'], y=df['ratio'], marker_color='orange', name='资产负债比率'), secondary_y=True)

# 计算主Y轴范围(覆盖资产、负债极值,留10单位余量)
y1_min = min(df['assets'].min(), df['liabilities'].min()) - 10
y1_max = max(df['assets'].max(), df['liabilities'].max()) + 10

# 计算主Y轴0值在轴范围内的垂直比例位置
y1_zero_pos = (0 - y1_min) / (y1_max - y1_min)

# 设定次Y轴对齐目标:1值对应主Y轴0值
y2_target = 1
# 设定次Y轴最小值(覆盖比率极值,留0.5单位余量)
y2_min = df['ratio'].min() - 0.5
# 根据比例计算次Y轴最大值,确保1值与主Y轴0值对齐
y2_max = y2_target + (y1_max - 0) * (y2_target - y2_min) / (0 - y1_min)

# 更新主Y轴设置
fig.update_yaxes(
    range=[y1_min, y1_max],
    title_text="资产/负债",
    secondary_y=False
)
# 更新次Y轴设置
fig.update_yaxes(
    range=[y2_min, y2_max],
    title_text="资产负债比率",
    showgrid=False,
    secondary_y=True
)

# 设置条形图分组显示,提升可读性
fig.update_layout(barmode='group')

fig.show()

关键说明:

  • 先计算主Y轴范围,确保覆盖所有数据并留有合理余量;
  • 计算主Y轴0值在整个轴范围中的垂直比例位置;
  • 根据该比例反向推导次Y轴的范围,让次Y轴的1值处于相同垂直比例位置,实现指定数值对齐;
  • 添加barmode='group'让两个条形图分组显示,优化可视化效果。

内容的提问来源于stack exchange,提问作者EduardoT80

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:03:19