如何按条件调用axvspan为时间序列指定区间添加背景阴影
实现方案
完全可以通过条件判断自动识别连续区间后调用axvspan实现该需求,不需要手动逐个指定阴影的起止坐标,哪怕是超长时序数据也可以批量自动处理。
实现逻辑
- 首先对
temp列做布尔判断,标记所有满足temp < 0的时间点 - 识别连续的满足条件的时间块,自动提取每个块的起止时间
- 遍历所有符合要求的连续时间块,批量调用
axvspan绘制浅色阴影,最后叠加values列的折线即可
完整代码
import pandas as pd import matplotlib.pyplot as plt # 加载/构造你的数据集 df = pd.DataFrame({'date': ["2014-10-04","2014-10-05", "2014-10-06", "2014-10-07", "2014-10-08", "2014-10-09","2014-10-10"], 'values': [0.6, 0.3, 0.1,0.2,0.6,0.3, 0.4],'temp': [4,0,-1,-3,2,-3, -2]}) df['date'] = pd.to_datetime(df['date'], format = '%Y-%m-%d') df.set_index('date', inplace=True) fig, ax = plt.subplots(figsize=(10,4)) # 识别temp<0的连续区段 neg_flag = df['temp'] < 0 # 为连续的同状态区段分配唯一组号 section_groups = neg_flag.ne(neg_flag.shift()).cumsum() # 遍历所有区段,仅对temp<0的区段绘制阴影 for gid, section in df.groupby(section_groups): if section['temp'].iloc[0] < 0: x_start = section.index[0] # 日度数据结束时间顺延1天,保证完整覆盖最后一个数据点的时间范围 x_end = section.index[-1] + pd.Timedelta(days=1) ax.axvspan(x_start, x_end, color='lightblue', alpha=0.3) # 绘制values列折线 ax.plot(df['values'], color='darkblue', marker='o') ax.set_ylabel('values') plt.tight_layout() plt.show()
注意事项
- 代码会自动识别所有连续的
temp<0区间,不需要手动输入任何坐标,支持任意长度的时序数据 - 如果你的数据不是日频粒度,只需要调整
pd.Timedelta的参数匹配你的数据采样间隔即可:比如小时级数据改为pd.Timedelta(hours=1),分钟级改为pd.Timedelta(minutes=1) - 调整
alpha参数可以修改阴影的透明度,数值越小阴影越浅

内容的提问来源于stack exchange,提问作者Kayla
相关产品推荐
相关产品推荐

