You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:25:41