微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改matplotlib在绘制时间戳对象时使用的步长?

我目前正在尝试使用matplotlib和pandas库绘制一个相当小的数据集.数据集的格式是CSV文件.这是数据集:

DATE,UNRATE
1948-01-01,3.4
1948-02-01,3.8
1948-03-01,4.0
1948-04-01,3.9
1948-05-01,3.5
1948-06-01,3.6
1948-07-01,3.6
1948-08-01,3.9
1948-09-01,3.8
1948-10-01,3.7
1948-11-01,3.8
1948-12-01,4.0

我使用pandas加载数据集(可以看出,保存该数据集的文件名为’dataset.csv’):

import matplotlib.pyplot as plt
import pandas as pd

dataset = pd.read_csv('dataset.csv')
dataset['DATE'] = pd.to_datetime(dataset['DATE'])

然后我尝试使用matplotlib绘制加载的数据集:

plt.plot(dataset['DATE'], dataset['UNRATE'])
plt.show()

上面的代码大部分工作正常,并显示如下图:

enter image description here

然而,问题是我希望在x轴上显示的数据似乎只是以两个间隔绘制:

enter image description here

我找到了问题,Changing the “tick frequency” on x or y axis in matplotlib?,这与我的问题有关.但是,从我的测试来看,似乎只能使用积分值.

我还发现了问题controlling the number of x ticks in pyplot,它似乎为我的问题提供了解决方案.答案说使用的方法to_pydatetime是DatetimeIndex方法.由于我的理解是认情况下pandas.to_datetime会返回DatetimeIndex,我可以在数据集[‘DATE’]上使用to_pydatetime:

plt.xticks(dataset['DATE'].to_pydatetime())

但是,我收到了错误

AttributeError: 'Series' object has no attribute 'to_pydatetime'

由于这似乎只是认行为,是否有办法强制matplotlib沿x轴绘制每个点的图形,而不是简单地绘制每个其他点的图形?

解决方法:

要消除错误,您可以按如下方式转换日期,并相应地设置标签

plt.xticks(dataset['DATE'].tolist(),dataset['DATE'].tolist())

或者如评论中提到的那样

plt.xticks(dataset['DATE'].dt.to_pydatetime(),dataset['DATE'].dt.to_pydatetime()) 

enter image description here

但是让我们看看一些更有用的选项.

绘制字符串

首先,可以按原样绘制数据,即作为字符串.

import matplotlib.pyplot as plt
import pandas as pd

dataset = pd.read_csv('dateunrate.txt')
plt.plot(dataset['DATE'], dataset['UNRATE'])

plt.setp(plt.gca().get_xticklabels(), rotation=45, ha="right")
plt.show()

enter image description here

这就像绘制plt.plot([“apple”,“banana”,“cherry”],[1,2,3]).这意味着连续日期只是在轴上一个一个地放置,而不管它们是分钟,一天还是一年.例如.如果您的日期是2018-01-01,2018-01-03,2018-01-27,那么它们在轴上的间距仍会相等.

用熊猫绘制日期(自动)

如果日期在数据框的索引中,Pandas可以很好地绘制开箱即用的日期.为此,您可以以第一个csv列被解析为索引的方式读取数据帧.

import matplotlib.pyplot as plt
import pandas as pd

dataset = pd.read_csv('dateunrate.txt', parse_dates=[0], index_col=0)
dataset.plot()

plt.show() 

enter image description here

这相当于

dataset = pd.read_csv('../dateunrate.txt', parse_dates=[0])
dataset = dataset.set_index("DATE")
dataset.plot()

要么

dataset = pd.read_csv('../dateunrate.txt')
dataset["DATE"] = pd.to_datetime(dataset["DATE"])
dataset = dataset.set_index("DATE")
dataset.plot()

甚至

dataset = pd.read_csv('../dateunrate.txt')
dataset["DATE"] = pd.to_datetime(dataset["DATE"])
dataset.plot(x="DATE",y="UNRATE")

在这种情况下这很好用,因为你碰巧每月有一个日期,并且在这种情况下,大熊猫将决定将所有12个月显示为ticklabels.
对于其他情况,这可能导致不同的刻度位置.

用matplotlib或pandas绘图日期(手动)

在一般情况下,您可以使用matplotlib.dates格式化程序和定位器以您想要的方式调整tick(标签).在这里,我们可以使用MonthLocator并将ticklabel格式设置为“%b%Y”.这适用于matplotlib plot或pandas plot(x_compat = True).

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

dataset = pd.read_csv('dateunrate.txt', parse_dates=[0], index_col=0)

plt.plot(dataset.index, dataset['UNRATE'])
## or use 
#dataset.plot(x_compat=True) #note the x_compat argument

plt.gca().xaxis.set_major_locator(mdates.MonthLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))

plt.setp(plt.gca().get_xticklabels(), rotation=45, ha="right")
plt.show()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐