Plotly不同缩放双Y轴对齐 实现单套Y轴刻度显示
Plotly双Y轴网格对齐实现方案
核心逻辑:双Y轴网格错位的本质是两个轴自动计算的刻度分段数、间隔不统一,只要给两个Y轴设置完全相同的刻度分段数量,按比例映射各自的数值范围,就能让网格线完全重合,视觉上呈现单套网格的效果。
修改要点
- 删除原有代码中冲突的
yaxis2=dict(anchor="x2")配置,双Y轴默认锚定同一个X轴,该配置会打乱轴映射关系 - 提前计算两个数据序列的数值范围,给轴范围预留5%的边距避免折线贴到图表边缘
- 给两个Y轴设置相同的
nticks(刻度总数)参数,强制刻度点按比例对齐 - 仅保留左侧Y轴的网格绘制,关闭右侧Y轴的网格,避免重复绘制导致的网格样式异常
- 保留原有左右Y轴的轴线颜色区分,对应两个不同数据序列
修改后完整代码
import plotly.graph_objects as go from plotly.subplots import make_subplots fig = make_subplots(specs=[[{"secondary_y": True}]]) # 计算两个序列的数值范围,预留边距避免折线贴边 cb_min, cb_max = df['Adj Close'].min(), df['Adj Close'].max() btc_min, btc_max = df2['Adj Close'].min(), df2['Adj Close'].max() cb_pad = (cb_max - cb_min) * 0.05 btc_pad = (btc_max - btc_min) * 0.05 # 添加两条折线 fig.add_trace(go.Scatter( x=df['Date'], y=df['Adj Close'], line_color='#222f3e', name='Coinbase' ), secondary_y=True) fig.add_trace(go.Scatter( x=df2['Date'], y=df2['Adj Close'], line_color='#FFC312', name='Bitcoin' ), secondary_y=False) # 全局布局配置 fig.update_layout( title={'text':'Performance comparada: Bitcoin e Coinbase','x':0.5}, xaxis_title='', yaxis_title='', paper_bgcolor='rgba(0,0,0,0)', plot_bgcolor='rgba(0,0,0,0)', font=dict(family="Montserrat SemiBold"), yaxis=dict( range=[btc_min - btc_pad, btc_max + btc_pad], nticks=6, showgrid=True, gridwidth=0.005, gridcolor='#dfe6e9', tickprefix='$', showline=True, linewidth=2, linecolor='#222f3e', side='left' ), yaxis2=dict( range=[cb_min - cb_pad, cb_max + cb_pad], nticks=6, showgrid=False, tickprefix='$', showline=True, linewidth=2, linecolor='#FFC312', side='right', overlaying='y' ) ) # X轴样式配置 fig.update_xaxes( showgrid=True, gridwidth=0.005, gridcolor='#dfe6e9', showline=True, linewidth=2, linecolor='black' ) fig.show()
可调参数说明
- 如果需要调整网格密度,同步修改两个Y轴的
nticks值即可,数值越大网格越密 - 如果需要固定刻度间隔而非固定刻度数量,可以把
nticks替换为dtick参数,两个轴的dtick按各自数值范围的比例设置即可,效果完全一致 - 预留边距比例可以根据显示需求调整,默认5%适配绝大多数折线图场景
内容的提问来源于stack exchange,提问作者Hugo Montan
相关产品推荐
相关产品推荐

