Plotly折线图按条件显示不同颜色/线型分段及问题修复
问题原因
代码无法正常显示线条、样式不生效的核心问题有三个:
- 循环添加
go.Scatter时每个trace只传入了单个坐标点,两个独立单点之间无法渲染连线,最终图上只有零散点位,没有连续折线 - 初始
px.line生成的全量默认trace,和后续循环添加的数十个同名48Htrace存在样式冲突,导致分段颜色、线型规则无法正常全局显示,只有鼠标悬停在单点上才能看到点位样式差异 - 现有逻辑没有对连续符合相同样式规则的点位做分组,逐点新增trace的写法本身就不适合绘制分段样式的折线。
修复代码
先按时间排序数据,给连续同规则的点位打组分段,每个分段单独传连续的坐标数组绘制线条,就能正常显示连线和样式差异:
import plotly.graph_objects as go import pandas as pd # 先确保数据按时间戳升序排列 df2 = df2.sort_values('Time_Stamp').reset_index(drop=True) # 标记点位是否属于下降段:当前值小于前一个值即判定为下降点 df2['is_drop'] = df2['Blob_1_Prob_48H'].diff() < 0 # 给连续相同规则的分段生成唯一ID,连续的非下降点、连续的下降点各为一个分段 df2['segment_id'] = (df2['is_drop'] != df2['is_drop'].shift()).cumsum() fig = go.Figure() # 逐段绘制折线 for seg_id, seg_data in df2.groupby('segment_id'): # 按分段规则配置线条样式 if seg_data['is_drop'].iloc[0]: line_config = dict(color='red', width=5, dash='dot') else: line_config = dict(color='#1f77b4', width=2, dash='solid') fig.add_trace(go.Scatter( x=seg_data['Time_Stamp'], y=seg_data['Blob_1_Prob_48H'], mode='lines+markers', name='48H', line=line_config, text=seg_data['Name'], # 仅第一个分段显示图例,避免生成重复图例项 showlegend=(seg_id == df2['segment_id'].iloc[0]), hovertemplate="Prediction Percentage: %{y}<br>Date &Time: %{x}<br>Name: %{text}<extra></extra>" )) fig.update_layout( title="ALEX(S)", xaxis_title='Date & time', yaxis_title='Blob percentage', yaxis_range=[0,105], showlegend=True, width=1200, height=600 ) fig.show()
实现说明
- 同一段内的连续点位传入同一个Scatter对象,会自动渲染为连续折线,不会再出现只有单点没有线的问题
- 下降段自动应用红色点线样式,其余分段使用默认蓝色实线,颜色、线型差异会直接在图表上显示,无需鼠标悬停即可看到
- 图例仅保留一项,不会出现数十个重复的
48H图例项
内容的提问来源于stack exchange,提问作者Bhanu
相关产品推荐
相关产品推荐

