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

Plotly多子图添加多条迹线时阈值线及部分数据线不显示问题

问题根源

你的代码核心问题出在trace追加的遍历逻辑上:

  • 你临时创建的fig对象中,先添加了2条阈值线,再添加了poses_values_array.shape[0]条数据线,总共有2 + poses_values_array.shape[0]条trace,但你向main_fig追加时只遍历了range(poses_values_array.shape[0]),只取了前N条trace,要么丢失阈值线要么丢失末尾的数据线,这就是超过2条线无法显示的直接原因。
  • 额外创建临时go.Figure()属于冗余操作,反而提升了trace索引匹配的出错概率。
  • 全局布局更新逻辑放在了trace追加循环内部,属于无效重复操作。
修复后代码示例
import plotly.subplots as subplots
import plotly.graph_objects as go

for p_i in range(poses_values_array.shape[1]-6): 
    if p_i%3 == 0:
        main_fig = subplots.make_subplots(rows=3, cols=1, subplot_titles=("lLeg","rLeg","Hip"))
    current_row = (p_i%3)+1

    # 直接添加阈值线到对应子图
    main_fig.add_trace(
        go.Scatter(
            x= list(range(poses_values_array.shape[2])), 
            y= [pose_max[p_i]] * poses_values_array.shape[2], 
            name=f'Max Pose {pose_motion[p_i%3]} {pose_names[int(p_i/3)]} Threshold'
        ),
        row=current_row, col=1
    )
    main_fig.add_trace(
        go.Scatter(
            x= list(range(poses_values_array.shape[2])), 
            y= [pose_min[p_i]] * poses_values_array.shape[2], 
            name=f'Min Pose {pose_motion[p_i%3]} {pose_names[int(p_i/3)]} Threshold'
        ),
        row=current_row, col=1
    )

    # 直接添加所有数据线到对应子图
    for t_i in range(poses_values_array.shape[0]):               
        main_fig.add_trace(
            go.Scatter(
                x=list(range(len(poses_values_array[t_i, p_i, :]))), 
                y=poses_values_array[t_i, p_i, :], 
                name=f'Target {t_i+1} - Pose {pose_motion[p_i%3]} {pose_names[int(p_i/3)]}'
            ),
            row=current_row, col=1
        )
    
    # 更新子图标题
    main_fig.layout.annotations[p_i%3].update(text=f"{pose_names[int(p_i/3)]} {pose_motion[p_i%3]} Pose")

    # 每处理完3个p_i(对应3行子图)统一更新全局配置
    if p_i%3 == 2:
        main_fig.update_layout(
            title=f'Aggregated {pose_names[int(p_i/3)]} Pose {p_i-2}-{p_i+1}',
            xaxis_title='Dataset',
            yaxis_title='Pose Value'
        )
        main_fig.update_yaxes(
            autorange=False, 
            zeroline=True, 
            zerolinewidth=2, 
            zerolinecolor='LightPink'
        )
        # 按需添加show()或者保存逻辑

如果觉得图例过长,可以给阈值线的go.Scatter加showlegend=False参数隐藏阈值线的图例。

内容的提问来源于stack exchange,提问作者Juan Solana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:00:03