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

时间:2018-03-25 01:27:00

标签: python pandas matplotlib

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

camera

我使用pandas加载数据集(可以看出,保存该数据集的文件名为' dataset.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

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

import matplotlib.pyplot as plt
import pandas as pd

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

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

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,它似乎为我的问题提供了解决方案。答案说使用的方法plt.plot(dataset['DATE'], dataset['UNRATE']) plt.show() DatetimeIndex的一种方法。由于我的理解是pandas.to_datetime默认会返回to_pydatetime,因此我可以在DatetimeIndex上使用to_pydatetime

dataset['DATE']

然而,我收到了错误:

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

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

1 个答案:

答案 0 :(得分:6)

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

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个月显示为勾选标签。
对于其他情况,这可能会导致不同的刻度位置。

用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