如何在绘制熊猫系列的同时标记新年的开始?

Posted

技术标签:

【中文标题】如何在绘制熊猫系列的同时标记新年的开始?【英文标题】:How to mark the beginning of a new year while plotting pandas Series? 【发布时间】:2017-10-20 10:07:42 【问题描述】:

我正在绘制这样的数据:

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


a = pd.DatetimeIndex(start='2010-01-01',end='2011-06-01' , freq='M')
b = pd.Series(np.random.randn(len(a)), index=a)

我希望绘图采用条形格式,所以我使用这个:

b.plot(kind='bar')

这是我得到的:

如您所见,日期的格式是完整的,非常丑陋且不可读。我碰巧测试了这个命令,它创建了一个非常好的日期格式:

b.plot()

如您所见:

我非常喜欢这种格式,它包括月份,标志着一年的开始,并且易于阅读。

在做了一些搜索之后,我最接近该格式的是使用这个:

fig, ax = plt.subplots()
ax.plot(b.index, b)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b'))

但是输出看起来像这样:

我可以通过这种方式在 x 轴上显示月份名称,但我更喜欢第一种格式。那要优雅得多。有谁知道我怎样才能为我的条形图获得完全相同的 xticks?

【问题讨论】:

this 有帮助吗? @Nuageux 感谢您的评论。这是一个不错的帖子,但不是我想要的。如果我能像第二个数字那样只在每年一月添加年份,那就太好了。 【参考方案1】:

这里有一个解决方案,可以为您提供所需的格式。您可以直接编辑刻度标签,并使用set_major_formatter() 方法:

fig, ax = plt.subplots()

ax.bar(b.index, b)

ticklabels = [item.strftime('%b') for item in b.index] #['']*len(b.index)
ticklabels[::12] = [item.strftime('%b\n%Y') for item in b.index[::12]]
ax.xaxis.set_major_formatter(matplotlib.ticker.FixedFormatter(ticklabels))
ax.set_xticks(b.index)
plt.gcf().autofmt_xdate()

输出:

【讨论】:

以上是关于如何在绘制熊猫系列的同时标记新年的开始?的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫的时间线上绘制时间段

如何在复杂的熊猫 groupby 中绘制图形?

如何在 matplotlib 中绘制我的熊猫数据框 [重复]

如何在图表中绘制熊猫 groupby 值

如何绘制熊猫数据框的多列

如何在熊猫中获得多级 x 轴标记图?