时间序列异常点单独配色绘制时异常点错误连线问题的解决方法问询
时间序列异常值绘图多余连线问题解决方案
问题原因
你使用sns.lineplot绘制筛选后的异常值时,seaborn会自动将传入的所有非空数据点按索引顺序连线,即使索引不连续也会强行连接,所以会出现跨正常区间的多余红线,不符合预期。
最优解决方案(适配离散单点异常场景)
优先采用「整体时间序列折线+异常点散点标记」的方案,异常点不会产生多余连线,辨识度也更高,修改后代码如下:
import seaborn as sns import matplotlib.pyplot as plt fig = plt.figure(figsize=(25,5)) ax1 = plt.subplot(121) # 绘制完整的时间序列折线 sns.lineplot(data=df['values'], ax=ax1, color='steelblue', label='正常序列') # 筛选异常值,用散点单独标记 anomaly_data = df[df['anomalies'] == True] sns.scatterplot(x=anomaly_data.index, y=anomaly_data['values'], color='red', s=120, edgecolor='black', ax=ax1, label='异常值') # 显示图例 plt.legend() plt.show()
其中参数s控制散点大小,edgecolor可以给散点加边框让标记更醒目,可根据需求调整。
可选方案(适配连续异常段变色需求)
如果你需要让异常区间的折线本身也显示为红色,可以将非对应区间的值设为NaN,lineplot遇到NaN会自动断开连线,代码如下:
fig = plt.figure(figsize=(25,5)) ax1 = plt.subplot(121) # 生成正常序列:异常位置设为NaN,折线自动断开 normal_series = df['values'].mask(df['anomalies'] == True) sns.lineplot(data=normal_series, ax=ax1, color='steelblue', label='正常序列') # 生成异常序列:正常位置设为NaN,仅连续异常区间会显示连线 anomaly_series = df['values'].mask(df['anomalies'] == False) sns.lineplot(data=anomaly_series, ax=ax1, color='red', linewidth=2, label='异常段') plt.legend() plt.show()
注意该方案下单个离散的异常点不会被绘制(单个点无法形成折线),仅适合存在连续异常值的场景。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

