首页 > 解决方案 > 在 matplotlib 中使用 axvspan 作为日期范围

问题描述

我想绘制一些随季节变化的时间序列,并使用 axvspan 将冬季部分的阴影部分与夏季部分的阴影部分不同。我正在使用pyplot.plot_date。我的 y 值是浮点数的 np 数组,我的 x 值是使用转换的日期时间对象的 np 数组

    datetime.strptime(date, '%m-%d-%Y'). 

我想使用pyplot.axvspan来应用阴影,但它似乎只适用于 x 轴的常规数字,而我的 x 轴是日期。我遇到的错误是

    ValueError: view limit minimum -36858.05 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units

有什么办法可以解决这个问题?

标签: pythondatematplotlibtime-series

解决方案


在 matplotlib 日期时间轴也使用数字,

Matplotlib 使用浮点数表示日期,该浮点数指定自 0001-01-01 UTC 以来的天数,加 1。

许多函数,如plot,等scatterbar自动将datetime对象转换为这些数字,而许多辅助函数,如axvspan,直到最近的 matplotlib 版本才进行这种自动转换。

所以在matplotlib 3中你可以很容易地做到

ax.axvspan(datetime(2019,3,1), datetime(2019,3,31))

但如果使用旧版本,您需要手动执行matplotlib.dates.date2num,例如

ax.axvspan(date2num(datetime(2019,3,1)), date2num(datetime(2019,3,31)))

一些完整的例子:

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

fig, ax = plt.subplots()

ax.plot([datetime(2019,2,14), datetime(2019,4,26)], [1,2])

ax.axvspan(date2num(datetime(2019,3,1)), date2num(datetime(2019,3,31)), 
           label="March", color="crimson", alpha=0.3)

ax.legend()
fig.autofmt_xdate()
plt.show()

在此处输入图像描述


推荐阅读