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

如何使用Matplotlib在时间序列图中标记多个特定事件日期?

用Matplotlib在时间序列中标记多个事件日期

我需要在时间序列数据集上用Matplotlib标记多个特定日期(代表需高亮的事件),目前已实现单个日期标记,但多日期标记失败。以下是可用的单日期实现代码、两种无效的多日期尝试代码,请求解决。

可用的单日期实现代码

from datetime import datetime
from matplotlib.dates import date2num

fig, ax = plt.subplots(figsize=(30,10))
ax.plot(df)
ax.axvspan(date2num(datetime(2022,4,8)), date2num(datetime(2022,4,8)), 
           label="Leaks",color="red", alpha=1)
ax.legend()
ax.set_ylabel('Values')
ax.set_title('Leaks in liquid Lvl', size=28)

单日期标记效果

无效的多日期尝试方法

方法一:错误传递多组参数给axvspan

from datetime import datetime
from matplotlib.dates import date2num
from matplotlib.dates import date3num
from matplotlib.dates import date4num


fig, ax = plt.subplots(figsize=(30,10))
ax.plot(df)

ax.axvspan(date2num(datetime(2022,4,8)), date2num(datetime(2022,4,8)), date3num(datetime(2022,6,22)), date3num(datetime(2022,6,22)),date4num(datetime(2022,9,2)), date4num(datetime(2022,9,2)),
           label="Leaks",color="red", alpha=1)

ax.legend()
ax.set_ylabel('Values')
ax.set_title('Leaks in liquid Lvl', size=28)

方法二:使用不存在的日期转换函数且注释了代码

from datetime import datetime
from matplotlib.dates import date2num
from matplotlib.dates import date3num
from matplotlib.dates import date4num


fig, ax = plt.subplots(figsize=(30,10))
ax.plot(df)
#ax.axvspan(date2num(datetime(2022,4,8)), date2num(datetime(2022,4,8)), 
           #label="Leaks",color="red", alpha=1)
#ax.axvspan(date3num(datetime(2022,6,22)), date3num(datetime(2022,6,22)), 
           #label="Leaks",color="red", alpha=1)
#ax.axvspan(date4num(datetime(2022,9,2)), date4num(datetime(2022,9,2)), 
           #label="Leaks",color="red", alpha=1)

ax.legend()
ax.set_ylabel('Values')
ax.set_title('Leaks in liquid Lvl', size=28)

正确的多日期标记解决方案

问题原因

  1. axvspan函数每次只能接受一组xmin和xmax参数,无法一次性传入多组日期对;
  2. Matplotlib中不存在date3num、date4num这类函数,所有日期转数值都用date2num即可;
  3. 第二种尝试中代码被注释,实际未执行标记逻辑。

实现代码

from datetime import datetime
from matplotlib.dates import date2num
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(30,10))
ax.plot(df)

# 定义所有需要标记的事件日期
event_dates = [
    datetime(2022, 4, 8),
    datetime(2022, 6, 22),
    datetime(2022, 9, 2)
]

# 循环遍历每个日期,逐个调用axvspan标记
for idx, event_date in enumerate(event_dates):
    date_num = date2num(event_date)
    # 仅第一个标记添加label,避免图例重复显示
    label_text = "Leaks" if idx == 0 else ""
    ax.axvspan(date_num, date_num, color="red", alpha=1, label=label_text)

ax.legend()
ax.set_ylabel('Values')
ax.set_title('Leaks in liquid Lvl', size=28)
plt.show()

说明

  • 将所有需标记的日期存入列表,通过循环批量处理,避免重复代码;
  • 每次调用axvspan处理一个日期,确保参数符合函数要求;
  • 控制图例仅显示一次,提升图表美观性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:45:50