Plotly图表添加次Y轴水平线问题求助
解决Plotly次Y轴添加水平线的问题
问题根源
你代码里的核心问题是add_shape方法不支持secondary_y=True参数,而且yref设为'y'是绑定主Y轴,要绑定次Y轴需要将yref设为'y2'。另外代码里还存在变量混用(df和df19)、初始px.line被覆盖无效的问题。
修正后的代码
import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots df = pd.read_csv(folder_path + filename) # 统一使用df,避免变量混淆 fig = make_subplots(specs=[[{"secondary_y": True}]]) # 添加主Y轴轨迹(如果需要保留原来的E1数据) fig.add_trace( go.Scatter(x=df['Odo'], y=df['E1'], mode='lines', name='E1'), secondary_y=False ) # 添加次Y轴的声速数据 fig.add_trace( go.Scatter(x=df['Distance'], y=df['SoundVelocity'], mode='lines', name='Reference Sensor A', line=dict(color="#70E305")), secondary_y=True ) # 在次Y轴(y2)添加y=40的水平线,覆盖整个X轴范围 fig.add_shape( type='line', x0=0, y0=40, x1=df['Distance'].max(), y1=40, line=dict(color='Red'), xref='x', yref='y2' # 关键:绑定次Y轴 ) # 可选:设置轴标签 fig.update_xaxes(title_text="Distance/Odo") fig.update_yaxes(title_text="E1 Value", secondary_y=False) fig.update_yaxes(title_text="Sound Velocity", secondary_y=True) fig.show()
关键修改点
- 将
add_shape的yref从'y'改为'y2',明确绑定次Y轴。 - 移除无效的
secondary_y=True参数(add_shape不识别该参数)。 - 统一变量名,避免
df和df19混用导致的逻辑错误。 - 如果需要保留最初的
E1数据轨迹,要在make_subplots后重新添加,否则之前的px.line会被覆盖。
更灵活的X轴范围设置
如果想让水平线自动覆盖整个X轴的显示范围,无需手动计算最大值,可以将x0设为0,x1设为1,同时把xref改为'x domain':
fig.add_shape( type='line', x0=0, y0=40, x1=1, y1=40, line=dict(color='Red'), xref='x domain', # 基于X轴的百分比范围,0是最左,1是最右 yref='y2' )
内容的提问来源于stack exchange,提问作者Tiger1982
相关产品推荐
相关产品推荐

