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

如何在Matplotlib中根据y值为折线图分段着色(列表数据场景)

适配列表数据实现Matplotlib折线变色的解决方案

我明白你的痛点——官方示例用函数生成数据,但咱们手里是现成的列表,直接套不上。其实核心思路是把列表数据按阈值拆分成不同段,分别绘制并指定颜色,下面给你两种可行的方法,结合你的现有代码来改:

方法一:拆分数据段分别绘制(简单直观)

这种方法适合你的场景,逻辑清晰,容易理解:

  1. 先把列表转换成numpy数组(方便用掩码筛选数据,纯列表操作也能实现,但numpy更高效)
  2. 创建掩码区分不同区间的数据:低于A_min、在A_min和B_max之间、高于B_max
  3. 针对每个掩码筛选出对应的x和y数据,用不同颜色绘制折线

修改后的完整代码

from matplotlib import pyplot as plt
import random
import sys
import numpy as np

# 设置颜色变化的阈值
A_min = 2
B_max = 28

# 模拟数据损坏
sim_crpt = random.randint(0,10)
print(sim_crpt)
randomy = []

if sim_crpt == 0:
    for i in range(0,20):
        randomy.append(0)
    print(randomy)
else:
    for i in range(0,20):
        n = random.randint(0,30)
        randomy.append(n)
    print(randomy)

# 检查数据损坏情况
tracker = 0
for i in randomy:
    if i == 0:
        tracker += 1
        if tracker > 5:
            sys.exit("Error, no data")

# 转换为numpy数组,方便后续筛选
time = np.arange(0, 20, 1)
randomy_np = np.array(randomy)

# 创建阈值对应的掩码
mask_below = randomy_np < A_min
mask_mid = (randomy_np >= A_min) & (randomy_np <= B_max)
mask_above = randomy_np > B_max

# 绘制不同区间的折线
plt.plot(time[mask_below], randomy_np[mask_below], color='red', label='Below Min')
plt.plot(time[mask_mid], randomy_np[mask_mid], color='blue', label='Normal Range')
plt.plot(time[mask_above], randomy_np[mask_above], color='green', label='Above Max')

# 绘制阈值线
plt.plot(time, [A_min]*len(time), linestyle='--', color='gray')
plt.plot(time, [B_max]*len(time), linestyle='--', color='gray')

plt.legend(['Below Min', 'Normal Range', 'Above Max', 'Minimum Threshold', "Maximum Threshold"])
plt.xlabel('Time')
plt.ylabel('Data Value')
plt.show()

方法二:使用LineCollection(更灵活,适合复杂分段)

如果你的需求更复杂(比如需要渐变颜色、更多分段),可以用LineCollection对象,它能给折线的每个线段单独设置颜色:

# 接上面的代码,替换绘制部分
from matplotlib.collections import LineCollection

# 创建线段列表:每个线段是[(x0,y0), (x1,y1)]的形式
points = np.column_stack((time, randomy_np)).reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

# 根据每个线段的y值设置颜色
colors = []
for y0, y1 in zip(randomy_np[:-1], randomy_np[1:]):
    # 取线段两端y值的情况判断颜色
    if y0 < A_min or y1 < A_min:
        colors.append('red')
    elif y0 > B_max or y1 > B_max:
        colors.append('green')
    else:
        colors.append('blue')

# 创建LineCollection并添加到图中
lc = LineCollection(segments, colors=colors)
fig, ax = plt.subplots()
ax.add_collection(lc)

# 设置坐标轴范围
ax.set_xlim(time.min(), time.max())
ax.set_ylim(min(randomy_np)-1, max(randomy_np)+1)

# 绘制阈值线
ax.plot(time, [A_min]*len(time), linestyle='--', color='gray')
ax.plot(time, [B_max]*len(time), linestyle='--', color='gray')

ax.legend(handles=[
    plt.Line2D([], [], color='red', label='Below Min'),
    plt.Line2D([], [], color='blue', label='Normal Range'),
    plt.Line2D([], [], color='green', label='Above Max'),
    plt.Line2D([], [], linestyle='--', color='gray', label='Thresholds')
])
plt.xlabel('Time')
plt.ylabel('Data Value')
plt.show()

关键说明

  • 方法一适合简单的阈值分段,代码易读,调试方便
  • 方法二更灵活,能处理每个线段的颜色,适合需要精细控制的场景
  • 两种方法都完全兼容你的列表数据,不需要把列表转换成函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:48:13