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

Plotly折线图按条件显示不同颜色/线型分段及问题修复

问题原因

代码无法正常显示线条、样式不生效的核心问题有三个:

  • 循环添加go.Scatter时每个trace只传入了单个坐标点,两个独立单点之间无法渲染连线,最终图上只有零散点位,没有连续折线
  • 初始px.line生成的全量默认trace,和后续循环添加的数十个同名48H trace存在样式冲突,导致分段颜色、线型规则无法正常全局显示,只有鼠标悬停在单点上才能看到点位样式差异
  • 现有逻辑没有对连续符合相同样式规则的点位做分组,逐点新增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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:22:49