python中堆积百分比条形图的问题[重复]

Posted

技术标签:

【中文标题】python中堆积百分比条形图的问题[重复]【英文标题】:Problems with stacked percentage bar chart in python [duplicate] 【发布时间】:2020-11-30 10:43:52 【问题描述】:

我在尝试了一切之后写了这个问题。我正在尝试使用this code 创建一个堆叠百分比条形图。我有以下df:


         name   first   second  third   fourth
0   C.McCaffrey 218.8   152.7   57.1    17.8
1   A.Jones     148.8   131.2   18.5    0.0
2   D.Cook      113.6   138.3   33.9    6.6
3   A.Ekeler    158.5   78.3    54.9    0.0
4   E.Elliott   139.9   91.2    47.0    6.2
5   L.Fournette 120.7   100.2   33.7    5.1
6   N.Chubb     149.7   95.2    10.8    0.2
7   D.Henry     156.6   80.5    11.3    7.1
8   C.Carson    95.7    99.0    29.7    14.2
9   M.Ingram    108.2   104.1   26.2    0.0
10  A.Kamara    103.9   99.0    25.0    0.4
11  S.Barkley   90.8    105.9   25.9    0.0
12  M.Sanders   88.7    78.7    41.2    0.0
13  T.Gurley    134.4   44.6    27.6    0.0
14  L.Bell      86.6    71.7    39.0    9.0
15  K.Drake     99.2    80.2    12.9    2.6
16  J.Mixon     104.9   81.4    7.8 0.7
17  P.Lindsay   100.4   65.7    16.9    9.4
18  J.Jacobs    135.9   40.2    13.7    1.8
19  D.Freeman   97.9    52.7    37.8    0.0
20  J.White     57.3    51.9    77.1    0.0
21  T.Cohen     56.2    59.9    30.4    30.4
22  M.Mack      91.2    62.7    5.0 0.7
23  M.Gordon    101.5   31.1    16.9    7.1
24  R.Jones     96.0    47.2    11.5    0.0
25  D.Montgomery63.5    67.1    22.2    0.3
26  C.Hyde      105.5   39.4    7.0 0.0
27  L.Murray    77.7    62.7    8.3 0.0
28  D.Singletary73.8    52.7    21.4    0.0
29  J.Williams  60.4    57.6    25.3    3.0

我正在使用示例中的确切代码

fig, ax = plt.subplots(figsize=(15,15))
plt.style.use('fivethirtyeight')

r = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]
# From raw value to percentage
totals = [i+j+k+l for i,j,k,l in zip(pivot['first'], pivot['second'], pivot['third'], pivot['fourth'])]
firstBars = [i / j * 100 for i,j in zip(pivot['first'], totals)]
secondBars = [i / j * 100 for i,j in zip(pivot['second'], totals)]
thirdBars = [i / j * 100 for i,j in zip(pivot['third'], totals)]
fourthBars = [i / j * 100 for i,j in zip(pivot['fourth'], totals)]
 
# plot
barWidth = 0.85
names = ('J.Jacobs',
 'C.Hyde',
 'T.Gurley',
 'M.Gordon',
 'R.Jones',
 'D.Henry',
 'N.Chubb',
 'M.Mack',
 'A.Ekeler',
 'J.Mixon',
 'L.Murray',
 'P.Lindsay',
 'D.Freeman',
 'K.Drake',
 'D.Singletary',
 'A.Jones',
 'E.Elliott',
 'C.McCaffrey',
 'L.Fournette',
 'A.Kamara',
 'M.Ingram',
 'M.Sanders',
 'L.Bell',
 'D.Montgomery',
 'J.Williams',
 'S.Barkley',
 'C.Carson',
 'D.Cook',
 'T.Cohen',
 'J.White')

plt.bar(r, firstBars, color='#D63E4F', edgecolor='white',width=barWidth)

plt.bar(r, secondBars, bottom=firstBars, color='#FCAE61', edgecolor='white',width=barWidth)

plt.bar(r, thirdBars, bottom=firstBars, color='#65C2A5', edgecolor='white',width=barWidth)

plt.bar(r, fourthBars, bottom=firstBars, color='#3387BD', edgecolor='white',width=barWidth)



plt.xticks(r, names)

plt.grid(zorder=0,alpha=.4)

但我的图表中的条形加起来不等于 100,如下所示。另外,为什么条形图不是按我绘制的顺序排列的?此外,为什么 J.White(显示的最后一个条形图)只有 firstsecond 的数据,而在数据框中很明显他有 third 的数据?我已经尝试过调试所有可以调试的东西,现在我很沮丧。我有确切的代码,这是怎么回事?另外,我很想把它做成水平条形图,但plt.barh() 不起作用。我会很感激任何帮助,我现在完全迷失了。

【问题讨论】:

plt.bar(r, thirdBars, bottom=firstBars+secondBars, ...plt.bar(r, fourthBars, bottom=firstBars+secondBars+thirdBars,...。请注意,首先您需要将列表转换为 numpy 数组:secondBars = np.array(secondBars) 等。 我试过了,但得到了ValueError: shape mismatch: objects cannot be broadcast to a single shape 哦,刚刚看到你对 numpy 数组的编辑。这一定是问题所在。 @JohanC 成功了。现在有办法让它水平吗? plt.hbar() 不起作用。 对于plt.barh,您需要像plt.barh(r, left=firstBar+secondBar, width=thirdBar, ... 这样的东西。或者只是使用@QuangHoang 的方法和s.plot.barh(...) 如果需要注释,请参阅 How to add the Legend labels as barplot annotations? 或 How to add labels to stacked bar (more than 2 stacks) chart in pandas。 【参考方案1】:

你的意思是:

s = df.set_index('name')
s = s.div(s.sum(1),axis='rows')
s.plot.bar(stacked=True)

输出:

对于水平条,只需将plot.bar 更改为plot.barh

s.plot.barh(stacked=True)

输出:

【讨论】:

ax = s.plot.barh(stacked=True, xlim=(0, 1)) 然后 ax.xaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(1)) 让事情看起来更好:)

以上是关于python中堆积百分比条形图的问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R lattice 重塑堆积条形图的数据 [重复]

具有 50 多个创建的虚拟变量的堆积条形图(百分比)? [关闭]

ggplot2:3路交互堆积条形图的分组条形图

Python:基于同一DF中多列值的堆积条形图[重复]

带有facet_grid的ggplot2中带有多个分类变量的堆积条形图

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