【问题标题】:matplotlib vlines between dates on x axisx轴上日期之间的matplotlib vlines
【发布时间】:2017-04-26 18:20:45
【问题描述】:

我已经创建了一个基于 pandas 数据框的 matplotlib 绘图,该数据框可以正确绘图。我正在在图表上添加垂直线。我可以通过使用这个来做到这一点:

permitdate = 'June 15, 2017'

ax.axvline(permitdate, linewidth=2)

许可日期可以是我想要绘制的任意日期。

我遇到的问题是指数(即图表上的 x-asix)是以月末为基础的:

DatetimeIndex(['2017-04-30', '2017-05-31', '2017-06-30', '2017-07-31',
               '2017-08-31', '2017-09-30', '2017-10-31', '2017-11-30',
               '2017-12-31'],
              dtype='datetime64[ns]', name='Date', freq=None)

当我尝试绘制 vlines 时,它会将线直接放在日期所在的月份上。

例如,上面的许可日期显示在 a 轴上的 6 月 x-tick 顶部。有没有办法在 6 月和 7 月的 x 刻度之间显示它,代表它在月份之间的实际位置,而不是直接在月份 x 轴位置上?

编辑:

受 pandas 文档启发的示例:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np

ts = pd.Series(np.random.randn(10), index=pd.date_range('1/1/2000', periods=10, freq='m'))
ts = ts.cumsum()


df = pd.DataFrame(np.random.randn(10, 4), index=ts.index, columns=list('ABCD'))


df = df.cumsum()

ax = df.plot()
designdate = 'July 15, 2000'
ax.axvline(designdate, linewidth=2)

谢谢,

伊万

【问题讨论】:

  • 在提供问题的minimal reproducible example 时,获得满意答案的机会总是更高。
  • @ImportanceOfBeingErnest,添加。谢谢提醒。

标签: python pandas matplotlib


【解决方案1】:

使用resample 结合interpolate 获得每日频率

ax = df.resample('D').interpolate().plot()
designdate = 'July 15, 2000'
ax.axvline(pd.to_datetime(designdate), linewidth=2)

【讨论】:

  • 我遇到了我不清楚的问题。以上适用于 vlines 问题,但 xaxis 没有移动。使用文本示例,如果没有重新采样,日期从 1 月到 10 月。全部显示月末日期(10 月 31 日在最右边)。随着重新采样,一月的下降,十月的左移。我无法弄清楚如何将其恢复原状。请问有什么想法吗?
  • @ivan7707 这是因为我们每天从 1 月底到 10 月底进行插值。一月底看起来像二月。图表有 1 天。至于 10 月,它有 31 天 10 月,标签从 10 月 1 日开始。您希望 vline 在 7 月和 8 月之间出现。这意味着你想在 7 月 1 日贴上 Jul 的标签。这就是结果。
  • 明白了。谢谢。