Plotly Python双Y轴柱状图零位对齐问题求助
Plotly Python 双Y轴零位对齐实现方案
可以实现双Y轴零位对齐,核心是手动计算并同步两个Y轴的刻度范围,让零点处于同一水平位置。
问题原因
原代码中两个Y轴使用自动刻度,由于两组数据量级差异大,Plotly会分别计算各自的最优范围,导致零点无法对齐。
解决代码
修改后的完整代码如下:
import pandas as pd from plotly.subplots import make_subplots import plotly.graph_objects as go data = {'col 1': [-6, 18.6, 106.35, 111], 'col 2': [-787.5, 976.5, 11246, 25682]} df_overview = pd.DataFrame(data) df_overview.index = ['A', 'B', 'C', 'D'] colors = ['#FF0000', '#0000FF'] # red, blue columns = ['col 1', 'col 2'] # 计算两个轴的极值,用于确定对齐零点的范围 y1_min, y1_max = df_overview['col 1'].min(), df_overview['col 1'].max() y2_min, y2_max = df_overview['col 2'].min(), df_overview['col 2'].max() # 计算每个轴需要延伸的比例,确保零点对齐 y1_abs_max = max(abs(y1_min), abs(y1_max)) y2_abs_max = max(abs(y2_min), abs(y2_max)) # 计算两个轴的比例,让零点到上下限的视觉高度一致 ratio = y1_abs_max / y2_abs_max if y2_abs_max != 0 else 1 # 设置两个轴的范围,确保零点对齐 y1_range = [-y1_abs_max, y1_abs_max] y2_range = [-y2_abs_max, y2_abs_max] if ratio == 1 else [-y1_abs_max/ratio, y1_abs_max/ratio] fig = make_subplots(specs=[[{"secondary_y": True}]]) for i, col in enumerate(columns): fig.add_trace( go.Bar(x=df_overview.index, y=df_overview[col], name=col, marker_color=colors[i], offsetgroup=i), secondary_y=(i == 0) ) fig.update_layout( barmode='group', font_size=14, hovermode="x unified", ) # 更新Y轴范围,实现零点对齐 fig.update_yaxes(range=y1_range, secondary_y=False) fig.update_yaxes(range=y2_range, secondary_y=True) fig.show()
关键逻辑说明
- 先获取两组数据的极值,计算各自的最大绝对值,确保正负方向的刻度范围以零点为中心对称
- 通过计算两组数据最大绝对值的比例,调整第二个Y轴的范围,使得零点到上下限的视觉距离一致,从而实现零位对齐
- 最后通过
update_yaxes手动设置两个Y轴的范围,覆盖自动刻度逻辑
内容的提问来源于stack exchange,提问作者TRK
相关产品推荐
相关产品推荐

