如何使用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)
正确的多日期标记解决方案
问题原因
axvspan函数每次只能接受一组xmin和xmax参数,无法一次性传入多组日期对;- Matplotlib中不存在
date3num、date4num这类函数,所有日期转数值都用date2num即可; - 第二种尝试中代码被注释,实际未执行标记逻辑。
实现代码
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
相关产品推荐
相关产品推荐

