使用 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 3.6中的matplotlib.image在python中打开.jpg图像
python使用matplotlib可视化线图(line plot)使用arrow函数在matplotlib可视化图像中添加箭头(drawing arrows in matplotlib)