matplotlib 我如何使Pandas分类堆叠条形图比例为100%

ijnw1ujt  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(150)

我正试图根据不同类别的计数(数据框中的“类”列)生成一个堆叠条形图。
我的数据也按另一个类别分组(“STRAT”列)。
我有实际的数字绘图,但我想得到这些作为比例,以100%的总和。即,所以所有的酒吧是图表的全高,像一个垂直饼图,为每一个'STRAT'类别。
像这样:x1c 0d1x
下面是我所尝试的和结果。
样本是大型数据集中的一小部分。

import pandas as pd

df_test= pd.read_excel('df.xlsx')

df_test

From    To  Interval (m)    Class   STRAT   Total %S
308     309    1            PAF     CBC     4.15
309     310    1            PAF     CBC     3.76
320     321    1            UC      CBC     0.85
330     331    1            UC      CBC     0.698
342     343    1            NAF     LBB     0.259
376     377    1            NAF     LBB     0.395
412     413    1            UC      LBB     1.19
51      52     1            PAF     UBB     2.27
420     420.5  0.5          UC      UAB     2.85
189     190    1            PAF     LBB     1.52
520     521    1            NAF     UAB     1.45
632     633    1            NAF     UAB     0.0615
644     645    1            NAF     UAB     0.178

df_test.groupby(['STRAT', 'Class']).size().unstack().plot.bar(stacked=True)

这将显示一个堆叠条形图,但未缩放到100%

我找不到一种简洁的方法将“Class count/total_counts”计算放入代码中以获得百分比而不是数字。

djmepvbi

djmepvbi1#

您可以使用matplotlib执行许多操作来强制缩放y轴,以便将所有内容归一化为100%,如下所示:100% Stacked Bar Chart in MatPlotLib
然而,您的问题可以更简单地解决。
如果这是具有两个关键列(类和STRAT)的 Dataframe :

import pandas as pd
import numpy as np
df = pd.DataFrame({'Class': 2*['a', 'b', 'c', 'd'],'STRAT': ['x', 'y', 'x', 'z','y','x','z','w'],'value': np.random.randint(0, int(1e2),8)})

然后,您可以通过以下方式轻松计算百分比:

df_pct = (df.groupby(['STRAT','Class'])['value'].count()/df.groupby(['STRAT'])['value'].count())

最后,您可以完全按照代码中的方式进行绘图:

df_pct.unstack().plot.bar(stacked=True)

相关问题