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

如何用Plotly将折线图中NaN对应线段改为红色并添加标记点?

实现方法

要实现把y列含NaN的对应线段改成红色并添加标记点,直接用Plotly Express的高层封装灵活性不足,建议结合Plotly Graph Objects手动补充轨迹,步骤如下:

  1. 先绘制正常非缺失值的折线,保留原有样式;
  2. 找出所有包含NaN的相邻点对,插值填充NaN后绘制红色线段;
  3. 给所有NaN对应的x位置添加红色标记点。

完整代码如下:

import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np

df = pd.DataFrame([1, None, None, 4, 6, None], columns=["y"])
df["x"] = [1, 2, 3, 4, 5, 6]
df["completed"] = [1, 0, 0, 1, 1, 0]

# 绘制正常有效数据的折线(仅连接无NaN的点)
fig = px.line(df.dropna(subset=["y"]), x="x", y="y", markers=True, color="completed")

# 生成需要画红色线段的相邻点对
red_segments = []
for i in range(len(df)-1):
    curr_y, next_y = df.iloc[i]["y"], df.iloc[i+1]["y"]
    if pd.isna(curr_y) or pd.isna(next_y):
        x_pair = [df.iloc[i]["x"], df.iloc[i+1]["x"]]
        y_pair = [curr_y, next_y]
        # 简单插值填充NaN,保证线段能连接
        if pd.isna(y_pair[0]):
            y_pair[0] = y_pair[1]
        if pd.isna(y_pair[1]):
            y_pair[1] = y_pair[0]
        red_segments.append((x_pair, y_pair))

# 添加红色线段
for x_p, y_p in red_segments:
    fig.add_trace(go.Scatter(
        x=x_p,
        y=y_p,
        mode="lines",
        line=dict(color="red"),
        showlegend=False
    ))

# 添加NaN位置的红色标记点
nan_points = df[df["y"].isna()]
fig.add_trace(go.Scatter(
    x=nan_points["x"],
    y=nan_points["y"].interpolate(method="linear"),  # 用插值y值保证标记在正确位置
    mode="markers",
    marker=dict(color="red", size=10),
    name="NaN位置"
))

fig.show()

说明

  • 正常线段保持你原来通过color="completed"设置的样式;
  • 红色线段会连接所有包含NaN的相邻x点,用简单的前后值插值保证线段连续;
  • NaN对应的x位置会显示红色标记点,插值后的y值让标记点对齐到折线的趋势线上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:15:51