使用 Python 的 matplotlib 在 x 轴上绘制日期

Posted

技术标签:

【中文标题】使用 Python 的 matplotlib 在 x 轴上绘制日期【英文标题】:Plotting dates on the x-axis with Python's matplotlib 【发布时间】:2012-03-26 12:40:06 【问题描述】:

我正在尝试根据日期绘制信息。我有一个格式为“01/02/1991”的日期列表。

我通过以下操作转换了它们:

x = parser.parse(date).strftime('%Y%m%d'))

这给了19910102

然后我尝试使用 num2date

import matplotlib.dates as dates
new_x = dates.num2date(x)

绘图:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

但是我得到一个错误。它说“ValueError:年份超出范围”。有什么解决办法吗?

【问题讨论】:

啊,我举了一个不好的例子日期。我的日期列表中实际上没有 2012 年 12 月 31 日。我已将其更改为 1991 年 1 月 2 日。 help(num2date): "x 是一个浮点值,它给出自 0001-01-01 以来的天数加一",因此 x=19910102 不对应于 1991 年 1 月 2 日 这个问题的解析器是什么? 【参考方案1】:

您可以更简单地使用plot() 而不是plot_date()

首先,将您的字符串转换为 Python datetime.date 的实例:

import datetime as dt

dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here

然后绘制:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()

结果:

【讨论】:

@bernie 谢谢,它真的帮助了我。但是,在我的问题中,我有太多天,所以整个情节都被堵塞了。如何使用您的方法在 x 轴上显示每第五个日期或每第十个日期? @erik 我知道这有点晚了,但我删除了两个 set_major 行,这为我清除了。失去了一些功能,但仍然有所改进。 不幸的是,它显示的不是 3 个日期,而是 6 个其他日期(尽管在那个间隔内)。使用 matplotlib-1.5.1【参考方案2】:

我的声誉太低,无法对@bernie 回复添加评论,回复@user1506145。我遇到了同样的问题。

答案是一个修正问题的区间参数

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

np.random.seed(1)

N = 100
y = np.random.rand(N)

now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=5))
plt.plot(days,y)
plt.gcf().autofmt_xdate()
plt.show()

【讨论】:

请注意,如果您要获取系列或索引的第一个日期和最后一个日期,那么由于这是一个范围,最后一个日期将被截断,您的代码会遇到错误.假设您的索引上有一个Date 列,那么您可以这样做:days = mdates.drange(d1.index.min(),d1.index.max() + dt.timedelta(days=1),dt.timedelta(days=1))。本质上,我在范围上限值的日期上加了 1 天。 我应该在 Jacek Szałęga 的代码中进行哪些更改,以便在 x 轴上分配随机日期,而不是在从 excel 文件收集/采样的 x 轴日期上?【参考方案3】:

正如@KyssTao 所说,help(dates.num2date) 表示x 必须是一个浮点数,给出自 0001-01-01 以来的天数加一。因此,19910102 不是 1991 年 1 月 2 日,因为如果您从 0001-01-01 开始计算 19910101 天,您会在 54513 年或类似年份得到一些东西(除以 365.25,一年中的天数)。

改用datestr2num(参见help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'

【讨论】:

如果您也可以添加import 语句会很好,以帮助像我这样的python新手。 @kkuilla 如果这仍然相关,我猜他的名字是import matplotlib.dates as dates

以上是关于使用 Python 的 matplotlib 在 x 轴上绘制日期的主要内容,如果未能解决你的问题,请参考以下文章

Python 使用 matplotlib绘制3D图形

python---matplotlib

在安卓上使用 python 和 matplotlib

使用python 3.6中的matplotlib.image在python中打开.jpg图像

python使用matplotlib可视化线图(line plot)使用arrow函数在matplotlib可视化图像中添加箭头(drawing arrows in matplotlib)

使用matplotlib在python中绘制曲线决策边界