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

