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

Posted

技术标签:

【中文标题】具有多列的 matplotlib 条形图,x 轴上的日期【英文标题】:matplotlib bar chart with multiple columns, dates on x axis 【发布时间】:2019-03-11 19:39:07 【问题描述】:

我正在尝试为数据框制作一个简单的条形图,其中包含日期作为索引和几列数据。

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()

然后我的条形相互重叠,日期以一个月为单位显示。

有人可以提出一个优雅的解决方案,如何绘制不会有上述缺点的条形图吗?

【问题讨论】:

Pandas 条形图是分类的。但对我来说,结果看起来不错。由于您执行的重采样,matplotlib 图表中一个月的偏移在您的数据中。 This example 展示了如何在 matplotlib 中制作分组条形图。 【参考方案1】:

我用 bar 和 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()
...

【讨论】:

谢谢!我也看到了这个解决方案,但没有设法使它与日期一起使用。 不确定它是否只在我身边,但我不得不使用df.index + datetime.timedelta(days=width) 来获得所需的输出

以上是关于具有多列的 matplotlib 条形图,x 轴上的日期的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib:在条形图上绘制多列熊猫数据框

Matplotlib条形图仅在非零条形图处显示x-ticks

Matplotlib 条形图不接受数组作为高度参数

使用 MatPlotLib 将多个条形图绘制成图表

R中具有多列整数的堆积条形图

创建具有平均丰度的堆叠条形图