我正在尝试根据不同类别(我的数据框中的“类”列)的数量来生成堆积的条形图。
我的数据也按另一个类别(“ STRAT”列)分组。
我已经绘制了实际的数字,但我想将这些数字作为总100%的比例来获取。即。因此,对于每个“ STRAT”类别,所有条形图都是图表的完整高度,就像垂直饼图一样。
下面是我尝试过的结果。
样本只是大型数据集的一小部分。
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%
我找不到一种巧妙的方法将“分类计数/总数”计算放入代码中以获取百分比而不是数字。
答案 0 :(得分:2)
您可以使用matplotlib进行很多操作来强制缩放y轴,以便将所有内容归一化为100%,如下所示: 100% Stacked Bar Chart in MatPlotLib
但是,您的问题可以更简单地解决。
如果这是您的数据框,其中包含两个关键列,即Class和STRAT:
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)})
然后您可以通过这种方式轻松计算%ges:
df_pct = (df.groupby(['STRAT','Class'])['value'].count()/df.groupby(['STRAT'])['value'].count())
最后,您可以完全按照代码中的方式进行绘图:
df_pct.unstack().plot.bar(stacked=True)