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
相关产品推荐
相关产品推荐

