我想绘制一些随季节变化的时间序列,并使用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
有什么办法解决这个问题?
答案 0 :(得分:0)
在matplotlib日期时间轴中,也使用数字namely
Matplotlib使用浮点数表示日期,该浮点数指定自0001-01-01 UTC以来的天数加1。
plot
,scatter
,bar
等许多函数会自动将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()
答案 1 :(得分:0)
感谢ImportanceOfBeingErnest的帮助,对于任何阅读过这本书的人来说,这就是我用冬季/夏季背景和单个标签进行绘图的方法:
yearlist = ['2013','2014','2015','2016','2017','2018','2019']
fig, ax = plt.subplots(figsize=(20, 10))
for i in range(len(yearlist)):
if yearlist[i] == '2013':
ax.axvspan(date2num(datetime.datetime(2012,10,15)), date2num(datetime.datetime(int(yearlist[i]),5,15)),
label="winter (15 october - 15 may)", color="crimson", alpha=0.3)
ax.axvspan(date2num(datetime.datetime(int(yearlist[i]),5,15)), date2num(datetime.datetime(int(yearlist[i]),10,15)),
label="summer (15 may - 15 october)", color="blue", alpha=0.3)
else:
ax.axvspan(date2num(datetime.datetime(int(yearlist[i-1]),10,15)), date2num(datetime.datetime(int(yearlist[i]),5,15))
, color="crimson", alpha=0.3)
ax.axvspan(date2num(datetime.datetime(int(yearlist[i]),5,15)), date2num(datetime.datetime(int(yearlist[i]),10,15)),
color="blue", alpha=0.3)