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(显示的最后一个条形图)只有 first
和 second
的数据,而在数据框中很明显他有 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 多个创建的虚拟变量的堆积条形图(百分比)? [关闭]