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

时间:2017-01-31 09:16:35

标签: 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'])

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

df2_.plot()

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

我开始关注this example,但我已经无法构建timedelta。

1 个答案:

答案 0 :(得分:4)

关于构造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")]

首先定义matplotlib轴对象,然后将其传递给DataFrame.plot()

,可以添加网格线并自定义轴标签
ax = plt.axes()
df2_.plot(ax=ax)

现在您可以为地图添加垂直网格线

ax.xaxis.grid(True)

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

ax.xaxis.set_major_locator(dates.MonthLocator(interval=3))

最后,我发现蜱虫非常拥挤,所以我将它们格式化以获得更好的效果

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

生成以下plot