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

如何按条件调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:27:48