首页 > 解决方案 > Matplotlib — 如何将堆叠的条形图放入子图中

问题描述

我正在尝试在 matplotlib 的同一图中绘制两个堆积条形图。下面的代码并不是绝对最小的,因为即使我将同一个图称为两个不同的子图,我也会遇到相同的错误,但是由于没有理由将同一个图绘制两次,所以我将groups列包含在内以制作情况比较平易近人。

df = pd.DataFrame({
   'groups': ['A', 'A', 'B', 'A', 'A', 'B', 'B', 'A', 'B', 'B'],
   'type_one': [223.3, 17.2, 13.5, 2.4, 9.2, 43.3, 15.2, 23.5, 21.4, 98.2],
   'type_two': [419.6, 42.0, 24.6, 33.6, 21.8, 11.5, 12.4, 91.2, 41.3, 16.2]
})

plt.figure(figsize=(12,4))

plt.subplot(121)
df[df.groups=='A'].plot.bar(stacked=True)

plt.subplot(122)
df[df.groups=='B'].plot.bar(stacked=True)

plt.show()

当我在 jupyter notebooks 中运行它时,我得到两个空的子图(一个在另一个之下,所以不在同一个图中),然后两个图中的第二个出现在下面。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

无论我设置stacked=Trueor False,都会发生这种情况,所以我猜这与.plot.bar()我在文档中找不到的有关。当我尝试与情节相同的事情时plt.bar(),情节正常。

标签: pythonpandasmatplotlibstacked-chart

解决方案


捕获由创建的轴subplot并传递给bar

ax = plt.subplot(121)
df[df.groups=='A'].plot.bar(stacked=True, ax=ax)

ax = plt.subplot(122)
df[df.groups=='B'].plot.bar(stacked=True, ax=ax)

输出:

在此处输入图像描述

注意您可以使用以下方法简化代码groupby

fig, axes = plt.subplots(1,2,figsize=(12,4))

for (k,d), ax in zip(df.groupby('groups'), axes.flat):
    d.plot.bar(stacked=True, ax=ax)

推荐阅读