带日期的 Matplotlib - 更改每月数据的标签和刻度

clo*_*g14 2 python matplotlib

我有一个这样的数据框:

data_ = list(range(106))
index_ =  pd.period_range('3/1/2004', '12/1/2012', freq='M')
df2_ = pd.DataFrame(data = data_, index = index_, columns = ['data'])
Run Code Online (Sandbox Code Playgroud)

我想绘制这个数据框。目前,我正在使用:

df2_.plot()
Run Code Online (Sandbox Code Playgroud)

现在我喜欢控制 x 轴上的标签(可能还有刻度)。特别是,我喜欢在轴上有每月的刻度,并且可能每隔一个月或每季度有一个标签。我也喜欢有垂直的网格线。

我开始研究这个例子,但我已经无法构建 timedelta。

小智 8

关于构造 timedelta,datetime.timdelta()没有指定月份的参数,因此坚持使用pd.date_range(). 但是,我发现类型的对象pandas.tslib.Timestamp不能很好地与 matplotlib 刻度配合使用,因此您可以将它们转换为这样的datetime.date对象

index_ = [pd.to_datetime(date, format='%Y-%m-%d').date() 
        for date in pd.date_range('2004-03-01', '2012-12-01', freq="M")]
Run Code Online (Sandbox Code Playgroud)

通过首先定义一个 matplotlib 轴对象,然后将其传递给,可以添加网格线和自定义轴标签 DataFrame.plot()

ax = plt.axes()
df2_.plot(ax=ax)
Run Code Online (Sandbox Code Playgroud)

现在您可以在绘图中添加垂直网格线

ax.xaxis.grid(True)
Run Code Online (Sandbox Code Playgroud)

并通过使用matplotlib.dates.MonthLocator并将间隔设置为 3来指定季度 xticks 标签

ax.xaxis.set_major_locator(dates.MonthLocator(interval=3))
Run Code Online (Sandbox Code Playgroud)

最后,我发现蜱虫非常拥挤,所以我对它们进行了格式化以使其更贴合

ax.xaxis.set_major_formatter(dates.DateFormatter('%b %y'))
labels = ax.get_xticklabels()
plt.setp(labels, rotation=85, fontsize=8)
Run Code Online (Sandbox Code Playgroud)

生产以下产品:

在此处输入图片说明