绘制堆积条形图

Posted

技术标签:

【中文标题】绘制堆积条形图【英文标题】:plotting stacked bar graph 【发布时间】:2021-12-27 08:47:34 【问题描述】:

我想使用 matplotlib 和 pandas 。下面的代码很好地绘制了条形图。但是当我将 a、b、c、d、e、f、g、h ..etc 更改为 1 月、2 月...它不会绘制相同的图表。它只绘制字母顺序。无论如何可以克服这个问题。

import pandas as pd
import matplotlib.pyplot as plt

years=["2016","2017","2018","2019","2020", "2021"]
dataavail=
    "a":[20,0,0,0,10,21],
    "b":[20,13,10,18,15,45],
    "c":[20,20,10,15,18,78],
    "d":[20,20,10,15,18,75],
    "e":[20,20,10,15,18,78],
    "f":[20,20,10,15,18,78],
    "g":[20,20,10,15,18,78],
    "h":[20,20,10,15,18,78],
    "i":[20,20,10,15,18,78],
    "j":[20,20,10,15,18,78],
    "k":[20,20,10,15,18,78],
    "l":[20,20,0,0,0,20],



df=pd.DataFrame(dataavail,index=years)

df.plot(kind="bar",stacked=True,figsize=(10,8))
plt.legend(loc="centre",bbox_to_anchor=(0.8,1.0))
plt.show()

但是当我将 a,b,c...部分中的代码更改为 January,February...

将熊猫导入为 pd 将 matplotlib.pyplot 导入为 plt

years=["2016","2017","2018","2019","2020", "2021"]
dataavail=
    "january":[20,0,0,0,10,21],
    "February":[20,13,10,18,15,45],
    "March":[20,20,10,15,18,78],
    "April":[20,20,10,15,18,75],
    "may":[20,20,10,15,18,78],
    "June":[20,20,10,15,18,78],
    "July":[20,20,10,15,18,78],
    "August":[20,20,10,15,18,78],
    "September":[20,20,10,15,18,78],
    "October":[20,20,10,15,18,78],
    "November":[20,20,10,15,18,78],
    "December":[20,20,0,0,0,20],



df=pd.DataFrame(dataavail,index=years)

df.plot(kind="bar",stacked=True,figsize=(10,8))
plt.legend(loc="centre",bbox_to_anchor=(0.8,1.0))
plt.show()

【问题讨论】:

dict 不能保证保留其条目的顺序,请尝试使用OrderedDict 你能建议如何实现orderedDict @AJBiffl @AJBiffl 你用的是哪个 Python 先生它的python 3.7 【参考方案1】:

使用 Python 3.9.7,您的图表看起来是一样的:

>>> df_alpha
       a   b   c   d   e   f   g   h   i   j   k   l
2016  20  20  20  20  20  20  20  20  20  20  20  20
2017   0  13  20  20  20  20  20  20  20  20  20  20
2018   0  10  10  10  10  10  10  10  10  10  10   0
2019   0  18  15  15  15  15  15  15  15  15  15   0
2020  10  15  18  18  18  18  18  18  18  18  18   0
2021  21  45  78  75  78  78  78  78  78  78  78  20

>>> df_month
      January  February  March  April  may  June  July  August  September  October  November  December
2016       20        20     20     20   20    20    20      20         20       20        20        20
2017        0        13     20     20   20    20    20      20         20       20        20        20
2018        0        10     10     10   10    10    10      10         10       10        10         0
2019        0        18     15     15   15    15    15      15         15       15        15         0
2020       10        15     18     18   18    18    18      18         18       18        18         0
2021       21        45     78     75   78    78    78      78         78       78        78        20

完整代码:

import pandas as pd
import matplotlib.pyplot as plt

years = ['2016', '2017', '2018', '2019', '2020', '2021']

dataavail1 = 'a': [20, 0, 0, 0, 10, 21], 'b': [20, 13, 10, 18, 15, 45], 'c': [20, 20, 10, 15, 18, 78], 'd': [20, 20, 10, 15, 18, 75], 'e': [20, 20, 10, 15, 18, 78], 'f': [20, 20, 10, 15, 18, 78], 'g': [20, 20, 10, 15, 18, 78], 'h': [20, 20, 10, 15, 18, 78], 'i': [20, 20, 10, 15, 18, 78], 'j': [20, 20, 10, 15, 18, 78], 'k': [20, 20, 10, 15, 18, 78], 'l': [20, 20, 0, 0, 0, 20]

dataavail2 = 'January': [20, 0, 0, 0, 10, 21], 'February': [20, 13, 10, 18, 15, 45], 'March': [20, 20, 10, 15, 18, 78], 'April': [20, 20, 10, 15, 18, 75], 'may': [20, 20, 10, 15, 18, 78], 'June': [20, 20, 10, 15, 18, 78], 'July': [20, 20, 10, 15, 18, 78], 'August': [20, 20, 10, 15, 18, 78], 'September': [20, 20, 10, 15, 18, 78], 'October': [20, 20, 10, 15, 18, 78], 'November': [20, 20, 10, 15, 18, 78], 'December': [20, 20, 0, 0, 0, 20]

df_alpha = pd.DataFrame(dataavail1, index=years)
df_month = pd.DataFrame(dataavail2, index=years)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 8))
df_alpha.plot(kind='bar', stacked=True, colormap=plt.cm.tab20, ax=ax1, rot=0)
df_month.plot(kind='bar', stacked=True, colormap=plt.cm.tab20, ax=ax2, rot=0)
plt.show()

更新:该代码也适用于 Python 3.7.12

【讨论】:

如何在此处输入 df_alpha 和 df_month 什么意思?我如何构建您的数据框?用你的代码 是的,先生/女士,你说得对 我刚刚重用了你的变量 yearsdataavail 并构建了两个数据框 如果可能,请发布完整代码...我无法输入您的代码

以上是关于绘制堆积条形图的主要内容,如果未能解决你的问题,请参考以下文章

尝试绘制堆积条形图时收到形状不匹配错误消息

绘制水平堆积条形图不适用于日期中的 x 轴

在悬停时在堆积条形图上绘制水平线(图表 js)

在Seaborn中绘制堆积条形图以显示聚类[重复]

spss如何删除堆积条形图中的某块数据

按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图