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

Python如何在时间序列折线图中按分类标注不同颜色背景

Python时间序列带分类背景可视化实现

这里用pandas处理时间数据,matplotlib实现绘图,代码可直接运行修改。

依赖安装

如果没有安装对应库先执行安装命令:
pip install pandas matplotlib

完整实现代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta

# ---------------------- 1. 构造模拟数据(实际使用替换为你的真实数据即可)----------------------
# 模拟表1:3分类区间数据(开始时间、结束时间、分类编号)
interval_data = [
    {"start": "2024-05-01 00:00:00", "end": "2024-05-01 00:05:00", "category": 1},
    {"start": "2024-05-01 00:05:00", "end": "2024-05-01 00:10:00", "category": 2},
    {"start": "2024-05-01 00:10:00", "end": "2024-05-01 00:15:00", "category": 3},
    {"start": "2024-05-01 00:15:00", "end": "2024-05-01 00:20:00", "category": 1},
]
# 转成DataFrame并把时间列转为datetime类型
interval_df = pd.DataFrame(interval_data)
interval_df["start"] = pd.to_datetime(interval_df["start"])
interval_df["end"] = pd.to_datetime(interval_df["end"])

# 模拟表2:10秒间隔的压力时序数据
start_time = datetime(2024,5,1,0,0,0)
end_time = datetime(2024,5,1,0,20,0)
time_list = [start_time + timedelta(seconds=10*i) for i in range(int((end_time - start_time).seconds//10)))]
pressure_list = [10 + i%5 + (i//3) for i in range(len(time_list))]
pressure_df = pd.DataFrame({"time": time_list, "pressure": pressure_list})

# ---------------------- 2. 绘图逻辑 ----------------------
# 定义分类对应的填充颜色映射,可自定义修改
color_map = {
    1: "#ff9999",
    2: "#99ff99",
    3: "#9999ff"
}

fig, ax = plt.subplots(figsize=(12, 6))

# 绘制压力折线图
ax.plot(pressure_df["time"], pressure_df["pressure"], color="#222222", linewidth=1.5, label="压力值")

# 遍历分类区间填充背景色
for _, row in interval_df.iterrows():
    ax.axvspan(row["start"], row["end"], color=color_map[row["category"]], alpha=0.3, label=f"分类{row['category']}")

# 处理图例,去重重复的图例项
handles, labels = ax.get_legend_handles_labels()
unique_handles_labels = dict(zip(labels, handles))
ax.legend(unique_handles_labels.values(), unique_handles_labels.keys(), loc="upper right")

# 调整x轴时间显示格式,适配不同时间跨度
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S"))
plt.xticks(rotation=45)
plt.xlabel("时间")
plt.ylabel("压力值")
plt.title("压力时序数据带分类区间背景")
plt.tight_layout()
plt.show()

代码说明

  • 所有时间数据需要先转为datetime类型才能正确匹配时间轴,如果你原始数据的时间是字符串格式,用pd.to_datetime()方法转换即可,注意匹配你自己的时间格式。
  • 分类对应的填充颜色、透明度、折线样式都可以根据需求自定义修改,分类数量如果有变化直接调整color_map的映射关系就行。
  • 生成的图会自动对齐时间轴,分类背景和折线不会互相遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:54:02