如何通过循环修改折线图指定时间区间的颜色?
折线图多时间区间的颜色修改实现
问题描述
我需要修改折线图中部分区域的颜色,现有原始时间序列DataFrame如下:
{'ICP': {0: 5.070969052803593, 1: 5.4817961734227065, 2: 6.397815732226121, 3: 6.0582909835985195, 4: 6.305368037683179, 5: 5.913004902475054, 6: 6.108737887168982, 7: 5.80118107371289, 8: 6.7867417878010965, 9: 5.088879690164107}, 'Timestamp': {0: Timestamp('2020-12-16 10:04:00'), 1: Timestamp('2020-12-16 10:05:00'), 2: Timestamp('2020-12-16 10:06:00'), 3: Timestamp('2020-12-16 10:07:00'), 4: Timestamp('2020-12-16 10:08:00'), 5: Timestamp('2020-12-16 10:09:00'), 6: Timestamp('2020-12-16 10:10:00'), 7: Timestamp('2020-12-16 10:11:00'), 8: Timestamp('2020-12-16 10:12:00'), 9: Timestamp('2020-12-16 10:13:00')}}
已绘制该DataFrame的折线图,同时存在一个包含时间区间的DataFrame:
{'BeginDate': {0: Timestamp('2020-12-16 10:04:00'), 14: Timestamp('2020-12-17 03:53:00'), 16: Timestamp('2020-12-17 18:09:00'), 18: Timestamp('2020-12-18 03:39:00'), 20: Timestamp('2020-12-19 00:11:00'), 24: Timestamp('2020-12-19 04:27:00'), 25: Timestamp('2020-12-19 08:55:00'), 28: Timestamp('2020-12-19 09:15:00'), 32: Timestamp('2020-12-19 13:50:00'), 33: Timestamp('2020-12-19 14:53:00')}, 'EndDate': {0: Timestamp('2020-12-17 03:12:00'), 14: Timestamp('2020-12-17 18:04:00'), 16: Timestamp('2020-12-18 03:36:00'), 18: Timestamp('2020-12-19 00:08:00'), 20: Timestamp('2020-12-19 04:17:00'), 24: Timestamp('2020-12-19 08:54:00'), 25: Timestamp('2020-12-19 09:12:00'), 28: Timestamp('2020-12-19 13:44:00'), 32: Timestamp('2020-12-19 14:52:00'), 33: Timestamp('2020-12-19 18:14:00')}}
我希望为该DataFrame每行对应的时间区间,修改折线图中对应段的颜色。目前仅能绘制单个区间的着色效果,代码如下:
# The entire time series ax = df['ICP'].plot(figsize = (16,5), title = "ICP") ax.set(xlabel='Dates', ylabel='ICP') # The orange part (a row of the dataframe, between two dates) ax = test['ICP'].plot(figsize = (16,5), title = "ICP") ax.set(xlabel='Dates', ylabel='ICP')
请问能否通过循环或其他方法实现多区间的颜色修改?
解决方案
可以通过循环实现多区间的颜色修改,核心思路是先绘制完整的基础折线图,再遍历每个时间区间,筛选对应区间的原始数据后,在同一坐标轴上重新绘制该段数据并指定高亮颜色。
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 假设原始数据DataFrame为df,时间区间DataFrame为interval_df # 将Timestamp设为索引,方便时间范围筛选 df = df.set_index('Timestamp') # 绘制基础折线图(作为底色) fig, ax = plt.subplots(figsize=(16,5)) df['ICP'].plot(ax=ax, color='blue', title="ICP") ax.set(xlabel='Dates', ylabel='ICP') # 遍历所有时间区间,绘制高亮段 highlight_color = 'orange' for _, row in interval_df.iterrows(): start_time = row['BeginDate'] end_time = row['EndDate'] # 筛选当前区间内的数据 segment_data = df.loc[start_time:end_time] # 在同一轴上绘制高亮段 segment_data['ICP'].plot(ax=ax, color=highlight_color) plt.show()
关键说明
- 先将原始数据的
Timestamp设为索引,是为了利用Pandas的时间范围切片快速筛选区间内的数据。 - 先绘制完整的基础折线,再叠加高亮区间,确保非高亮区域保持原始颜色,高亮区域覆盖为指定颜色。
- 若需要不同区间使用不同颜色,可以维护一个颜色列表(如
colors = ['orange', 'red', 'green']),循环时按顺序取用即可。
内容的提问来源于stack exchange,提问作者Alan CUZON
相关产品推荐
相关产品推荐

