如何用Plotly将折线图中NaN对应线段改为红色并添加标记点?
实现方法
要实现把y列含NaN的对应线段改成红色并添加标记点,直接用Plotly Express的高层封装灵活性不足,建议结合Plotly Graph Objects手动补充轨迹,步骤如下:
- 先绘制正常非缺失值的折线,保留原有样式;
- 找出所有包含NaN的相邻点对,插值填充NaN后绘制红色线段;
- 给所有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
相关产品推荐
相关产品推荐

