Matplotlib plot_date() 在指定日期添加垂直线

24

我的数据以pandas dataframe的形式存储。我使用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还很陌生。

谢谢。

2个回答

33

在MatPlotLib 1.4.3中,这个可以工作:

import datetime as dt

plt.axvline(dt.datetime(2012, 9, 21))
传递字符串类型的日期(2012-09-21)是无效的,因为 MPL 不知道这是一个日期。您使用的加载文件的任何代码可能会隐式地将字符串创建为datetime对象,这就是为什么绘图调用起作用的原因。
另外,在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之间。 - annievic
在matplotlib 3.0.2中仍然可以正常工作,即使是不返回其轴的子图。 - Loek

18
使用pandas。这里有一个例子,为了安全起见,还将其转换为时间戳:
 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')
plt = df.plot(marker='o')
plt.axvline(pd.Timestamp('2013-09-21'),color='r')

这是输出结果:

output


1
我认为这行代码 df.plot(marker='o') 应该改为 plt=df.plot(marker='o') - Gombo
@Gombo:谢谢,已修复。 - ntg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接