【问题标题】:Adding a verticle line using axvline in matplotlib based on datetime data基于日期时间数据在matplotlib中使用axvline添加垂直线
【发布时间】:2021-05-13 14:39:50
【问题描述】:

我正在尝试使用 axvline 将垂直线添加到使用 matplotlib 的折线图中,并且遇到了反复出现的错误。我一直在寻找解决方案并阅读这里的建议How to draw vertical lines on a given plot in matplotlib,但他们并没有特别关注使用日期时间。这里讨论了一个解决方案matplotlib plot_date() add vertical line at specified date,这里给出了一个类似的答案How do you plot a vertical line on a time series plot in Pandas?,这很有帮助,但是当我实施建议时(建议基本上是添加 plt.axvline(dt.datetime(2020, 9, 21))我的折线图将所有数据压缩到一个点,并在图表的末尾添加一条垂直线like so

这是我的代码:

Australia_data.set_index('date')['new_cases'].plot()
sns.set(font_scale=1.4)
Australia_data.set_index('date')['new_cases'].plot(figsize=(12, 10), linewidth=2.5)
plt.xlabel("Date", labelpad=15)
plt.ylabel("New Cases", labelpad=15)
plt.title("Australia daily COVID-19 cases", y=1.02, fontsize=22)
plt.axvline(dt.datetime(2020, 9, 21))

真的不知道这里出了什么问题,任何建议将不胜感激!

【问题讨论】:

  • 对我来说,如果我使用 Python 日期时间列表作为 x 轴,axvline 可以正常工作。因此,既然您在这里为 pd DataFrame 调用 plot 方法,我怀疑这与 pandas 在图中处理日期时间的方式有关。您可能需要调整 axvline 的 x 坐标。

标签: python datetime matplotlib axvline


【解决方案1】:

您应该能够同时使用 pandas.Timestamp 和 Python datetime 对象作为 axvline 的 x 坐标:

from datetime import datetime
from matplotlib import pyplot as plt
import pandas as pd

# dummy dataframe with a datetime index:
df = pd.DataFrame({'v': range(12)},
                  index=pd.date_range('2020', periods=12, freq='MS'))

df.plot()
# using a pandas timestamp:
plt.axvline(pd.Timestamp("2020-06-01"), color='r')
# using a datetime object:
plt.axvline(datetime(2020,8,1), color='g')

给予:

版本:Python 3.8.7 x86-64、pandas 1.2.1、matplotlib 3.3.3

【讨论】:

  • 嗯,是的,使用 pandas.Timestamp 解决了这个问题,非常感谢!