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
相关产品推荐
相关产品推荐

