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
相关产品推荐
相关产品推荐

