将两个堆叠条形图合并成一个分组堆叠条形图。

4

所以我在网上找到了以下的代码:

import matplotlib.pyplot as plt
import matplotlib

matplotlib.style.use('ggplot')

plotdata = pd.DataFrame({
    "2018_m":[40, 12, 10, 26, 36],
    "2019_m":[19, 8, 30, 21, 38],
    "2020_m":[10, 10, 42, 17, 37]
    }, index=["Dad", "Mam", "Bro", "Sis", "Me"]
)

plotdata2 = pd.DataFrame({
    "2018_y":[20, 22, 10, 34, 12],
    "2019_y":[12, 19, 27, 35, 14],
    "2020_y":[21, 31, 52, 20, 34]
    }, index=["Dad", "Mam", "Bro", "Sis", "Me"]
)

stacked_data = plotdata.apply(lambda x: x*100/sum(x), axis=1)
stacked_data2 = plotdata2.apply(lambda x: x*100/sum(x), axis=1)
stacked_data.plot(kind="bar", stacked=True)
stacked_data2.plot(kind="bar", stacked=True)

以下是输出结果:

enter image description here

我在想最好的方法是如何将它们组合起来,使得Dad、Mam、Bro等每个人都有两个堆叠的条形图?我在网上和Stack Overflow的其他分组堆叠条形码中遇到了一堆代码,但它们要求您迭代地定义每个条的值,而理想情况下,我只想引用上面代码中的数据框名称'plotdata'和'plotdata2'。
1个回答

11

对于两个组,您可以传递 position 并相应地调整宽度:

fig, ax = plt.subplots()

stacked_data.plot(kind="bar", stacked=True, width=0.4, 
                  ax=ax, position=0)
stacked_data2.plot(kind="bar", stacked=True, width=0.4, 
                   ax=ax, position=1, hatch='//')

ax.set_xlim(right=len(stacked_data)-0.5)

输出:

在此输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接