带有多列的matplotlib条形图,x轴上的日期

时间:2018-10-06 14:41:51

标签: python pandas matplotlib charts

我正在尝试为一个数据框创建一个简单的条形图,该数据框具有日期作为索引和几列数据。

start_date = pd.to_datetime('20180101')
dates = pd.date_range(start_date, periods=365)
df = pd.DataFrame(np.random.randn(365,4), index = dates, columns = list('ABCD'))
df = df.resample('M').sum()

如果我使用

df.plot.bar()

然后将x轴上的日期弄乱了。 如果我使用

fig, ax = plt.subplots()
ax.bar(df.index, df['A'],width = 5, align = 'center')
ax.bar(df.index, df['B'], width = 5 , align = 'center')
ax.bar(df.index, df['C'],width = 5, align = 'center')
ax.bar(df.index, df['D'], width = 5 , align = 'center')
ax.xaxis_date()
ax.get_xaxis().set_major_locator(mdates.MonthLocator())
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%b %Y"))
fig.autofmt_xdate()
plt.show()

然后,我的条形图相互重叠,并且显示的日期偏移了一个月。

请问有人可以提出一种优雅的解决方案,如何绘制没有上述缺点的条形图?

1 个答案:

答案 0 :(得分:1)

我用竖杠和used this example做了一个类似的项目,以使格式正确。

由于我没有mdates值,因此无法运行它来检查它是否正确,但是请尝试这样做:

...
fig, ax = plt.subplots()
width = 5
ax.bar(df.index, df['A'], width, align = 'center')
ax.bar(df.index + width , df['B'], width, align = 'center')
ax.bar(df.index + 2*width, df['C'], width, align = 'center')
ax.bar(df.index + 3*width, df['D'], width, align = 'center')
ax.set_xticks(df.index + width) # sets the x-ticks to the middle of the cluster of bars
ax.xaxis_date()
...