python - 在 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
有什么办法可以解决这个问题?
解决方案
在 matplotlib 日期时间轴也使用数字,即
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()
推荐阅读
- flutter - 无法在 StatefulWidget 中进行排序
- python - 贪心算法无法正常运行
- c# - 将字节数据转换为图像并保存?使用 SQL 查询
- c# - C# 如何格式化日期(日期时间)
- python - 如何使用 argparse 解析具有默认值的互斥参数组,以便只有一个参数获得默认值?
- vim - 如何设置 VS Code 以使用 shift ZZ 保存文件?
- c# - 仅根据条件部分填充数据集
- python-3.x - 基于带条件的任务调度器调度 Python 脚本
- docker - 测试自动化 ZAP 和 E2E(赛普拉斯)
- spring-boot - 升级spring boot到2.2.6版本,nginx返回错误400