如何让Plotly双Y轴图表的左侧Y轴刻度与右侧自动对齐?
实现Plotly双Y轴网格线自动对齐的解决方案
要解决双Y轴网格线错位的问题,核心是让左侧Y轴的刻度完全匹配右侧Y轴的网格线位置,通过数据范围比例映射的方式实现,逻辑可自动适配任意DataFrame,具体实现如下:
核心思路
- 分别获取左右轴数据的极值(最小值、最大值)
- 基于右侧Y轴的刻度位置,通过数据范围比例计算左侧Y轴对应的刻度值
- 手动指定左右轴的刻度和范围,强制网格线对齐
完整代码实现
import plotly.graph_objects as go import numpy as np # 提取左右轴对应的数据 cur_data = line_df['CUR (€)'] pp_data = line_df['CUR PP'] # 1. 计算左右轴数据的极值 left_min, left_max = cur_data.min(), cur_data.max() right_min, right_max = pp_data.min(), pp_data.max() # 2. 生成右侧Y轴的均匀刻度(可自定义刻度数量) right_ticks = np.linspace(right_min, right_max, num=5) # 生成5个均匀分布的刻度 # 3. 通过比例映射计算左侧Y轴对应的刻度值 left_ticks = left_min + (left_max - left_min) * (right_ticks - right_min) / (right_max - right_min) # 创建图表轨迹 bar_trace = go.Bar(x=line_df['Year/Quarter'], y=cur_data, name='CUR (€)') line_trace1 = go.Scatter(x=line_df['Year/Quarter'], y=pp_data, name='CUR PP 1', yaxis='y2', mode='lines+markers', line=dict(color='orange')) line_trace2 = go.Scatter(x=line_df['Year/Quarter'], y=pp_data, name='CUR PP 2', yaxis='y2', mode='lines+markers', line=dict(color='red')) # 配置布局,强制左右轴刻度对齐 layout = go.Layout( title='双Y轴网格线对齐示例', yaxis=dict( title='CUR (€)', range=[left_min, left_max], tickvals=left_ticks, # 手动绑定左轴刻度 tickformat='.2f' # 根据需求调整小数显示位数 ), yaxis2=dict( title='CUR PP', overlaying='y', side='right', range=[right_min, right_max], tickvals=right_ticks, # 手动绑定右轴刻度 tickformat='.2f' ) ) fig = go.Figure(data=[bar_trace, line_trace1, line_trace2], layout=layout) fig.show()
关键说明
- 刻度数量可通过
np.linspace的num参数调整,比如改成6个刻度只需修改为num=6 - 若数据包含异常值,可先对数据做截断处理(比如取95分位数),避免极值干扰刻度分布
- 该逻辑完全基于输入数据的极值计算,更换DataFrame时只需替换
cur_data和pp_data的数据源即可自动适配
内容的提问来源于stack exchange,提问作者hvahva
相关产品推荐
相关产品推荐

