【问题标题】:How can I create a stacked bar chart in matplotlib where the stacks vary from bar to bar?如何在 matplotlib 中创建堆叠条形图,其中堆栈因条形图而异?
【发布时间】:2019-11-08 23:59:31
【问题描述】:

所以我有一个看起来像这样的 pandas DataFrame:

       year country  total
0  2010     USA     10
1  2010    CHIN     12
2  2011     USA      8
3  2011    JAPN     12
4  2012    KORR      7
5  2012     USA     10
6  2013    CHIN      9
7  2013     USA     13

我想在 matplotlib 中创建一个堆积条形图,其中每年有一个条形图,该年有两个国家的堆叠,高度基于 total 列。颜色应基于国家并在图例中表示。

我似乎无法弄清楚如何做到这一点。我想我可以使用 for 循环遍历每年和每个国家,然后使用与字典中的值相对应的颜色构建条形图。但是,这将为每个单独的条创建单独的图例条目,以便图例中有 8 个总值。据我所知,这也是在 matplotlib 中绘制图表的一种非常低效的方法。

谁能指点一下?

【问题讨论】:

  • 我想这是一种解决方案,但我不得不想象有一种更有效的方法可以做到这一点。对于制作这样的图表,嵌套循环似乎是一个糟糕的选择。
  • 这相当于每年的缺失国家在该特定年份的值为 0,不是吗?所以和普通的条形图是一样的。

标签: python pandas matplotlib


【解决方案1】:

您需要先转换您的df。可以通过以下方式完成:

df = pd.DataFrame({'year': {0: 2010, 1: 2010, 2: 2011, 3: 2011, 4: 2012, 5: 2012, 6: 2013, 7: 2013},
                   'country': {0: 'USA', 1: 'CHIN', 2: 'USA', 3: 'JAPN', 4: 'KORR', 5: 'USA', 6: 'CHIN', 7: 'USA'},
                   'total': {0: 10, 1: 12, 2: 8, 3: 12, 4: 7, 5: 10, 6: 9, 7: 13}})

df2 = df.groupby(['year',"country"])['total'].sum().unstack("country")
print (df2)

#
country  CHIN  JAPN  KORR   USA
year                           
2010     12.0   NaN   NaN  10.0
2011      NaN  12.0   NaN   8.0
2012      NaN   NaN   7.0  10.0
2013      9.0   NaN   NaN  13.0
#

ax = df2.plot(kind='bar', stacked=True)

plt.show()

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2021-10-22
    • 2023-01-21
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多