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

Python中如何根据数值为绘制曲线的不同分段设置对应颜色

Pandas 折线图按数值分段着色实现方法

原生df.plot() 方法不支持单条折线按数值区间分段设置颜色,其color参数仅支持为整条折线、或多子图场景下的不同折线分配统一颜色,要实现分段着色需要逐段绘制线段,具体实现步骤如下:

1. 建立数值到颜色的映射规则

直接通过条件判断匹配分箱和对应颜色即可,不需要复杂配置:

  • 0-5(Low区间):蓝色
  • 6-15(Mid区间):绿色
  • ≥16(High区间):红色

2. 完整可运行代码

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

# 定义数值匹配颜色的函数
def value2color(val):
    if val <= 5:
        return "#1f77b4"  # 蓝色对应Low
    elif 6 <= val <= 15:
        return "#2ca02c"  # 绿色对应Mid
    else:
        return "#d62728"  # 红色对应High

# 初始化绘图画布
fig, ax = plt.subplots(figsize=(9, 8))

# 遍历相邻数据点,逐段绘制折线
for idx in range(len(df) - 1):
    # 提取当前线段的两个端点坐标
    x_coords = [df["Timestamp"].iloc[idx], df["Timestamp"].iloc[idx+1]]
    y_coords = [df["Value"].iloc[idx], df["Value"].iloc[idx+1]]
    # 线段颜色取起始点所属区间的对应色
    line_color = value2color(df["Value"].iloc[idx])
    ax.plot(x_coords, y_coords, color=line_color, linewidth=2)

# 添加自定义图例、坐标轴标签
legend_handles = [
    Patch(facecolor="#1f77b4", label="Low (0-5)"),
    Patch(facecolor="#2ca02c", label="Mid (6-15)"),
    Patch(facecolor="#d62728", label="High (≥16)")
]
ax.legend(handles=legend_handles)
ax.set_xlabel("Timestamp")
ax.set_ylabel("Value")

plt.show()

注意事项

  • 上述代码为简化实现,跨区间的线段(比如相邻两点分别属于Low和Mid区间)会统一按起始点颜色绘制。如果需要严格按数值分界点拆分上色,可以在两点间根据阈值做线性插值,算出分界点坐标后拆分线段分别绘制。
  • 如果数据集规模较大(数据点超过1万),逐段调用plot()的性能较差,可以替换为matplotlib的LineCollection批量生成线段,渲染速度会快很多。
  • 不需要额外安装第三方库,基于pandas和matplotlib的原生能力即可实现效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:39:17