【问题标题】:matplotlib plot_date() add vertical line at specified datematplotlib plot_date() 在指定日期添加垂直线
【发布时间】:2016-01-12 11:41:55
【问题描述】:

我的数据存储为 pandas 数据框。我使用 matplotlib 中的 plot_date() 函数创建了日期(对象格式)与百分位数(int64 格式)的图表,并希望在预先指定的日期添加一些垂直线。

我已经设法在预先指定的日期添加点标记,但似乎找不到将它们变成垂直线的方法。

我在 SO/SE 上找到了关于如何将垂直线添加到 plot() 的各种答案,但是我无法将我的数据转换为 plot() 可以使用的格式,因此我使用 plot_date ()。

样本数据:

date       percentile
2012-05-30  3
2014-11-25  60
2012-06-15  38
2013-07-18  16

我绘制图表的代码如下:

x_data = data["date"]
y_data = data["percentile"]

plt.figure()
plt.plot()

#create a scatter chart of dates vs. percentile
plt.plot_date(x = x_data, y = y_data)

#now add a marker at prespecified dates - ideally this would be a vertical line
plt.plot_date(x = '2012-09-21', y = 0)

plt.savefig("percentile_plot.png")
plt.close()

很遗憾,我无法提供当前输出的图像,因为代码位于无法访问网络的终端上。

非常感谢任何帮助 - 在我如何提出问题方面也是如此,因为我对 SO / SE 很陌生。

谢谢。

【问题讨论】:

    标签: date python-3.x matplotlib plot


    【解决方案1】:

    使用熊猫。这是一个示例,也转换为时间戳以防万一:

     df = pd.DataFrame({
        'date':[
            '2012-05-30',
            '2014-11-25',
            '2012-06-15',
            '2013-07-18',
        ],
        'percentile':[3,60,38,16]
    })
    df['date'] = df['date'].apply(pd.Timestamp)
    df=df.set_index('date')
    df.plot(marker='o')
    plt.axvline(pd.Timestamp('2013-09-21'),color='r')
    

    这是输出:

    【讨论】:

      【解决方案2】:

      在 MatPlotLib 1.4.3 中有效:

      import datetime as dt
      
      plt.axvline(dt.datetime(2012, 9, 21))
      

      传递字符串样式的日期 (2012-09-21) 不起作用,因为 MPL 不知道这是一个日期。无论您使用什么代码来加载文件,都可能从字符串中隐式创建 datetime 对象,这就是 plot 调用起作用的原因。

      此外,在 MPL 1.4.3 中,我不需要调用 plt.plot_date(data['date'], ...),只要 data['date'] 列是 datetime 对象的列,只需调用 plt.plot(data['date'], ...) 即可。

      祝你好运。

      【讨论】:

      • 感谢您的快速回复。我成功地使用 pandas.to_datetime(data ['date']) 将日期字段转换为 datetime62 [ns]。但是,当我使用 plt.plot(x = data ['date'], y = data['percentile']) 时,结果图表完全空白,两个轴的范围从 -0.06 到 +0.06。
      • 在 matplotlib 3.0.2 中仍然可以正常工作,即使子图不返回轴。