Я пытаюсь создать гистограмму с накоплением на основе подсчета различных категорий (столбец «Класс» в моем фрейме данных).
Мои данные также сгруппированы по другой категории (столбец «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%.
Я не могу найти удобный способ поместить в код вычисление «счетчик классов/общее количество», чтобы получить процент вместо числа.
Вы можете многое сделать с помощью matplotlib, чтобы принудительно масштабировать ось Y, чтобы она нормализовала все до 100%, как показано здесь: Столбчатая диаграмма со 100% накоплением в 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)
Правильно - если записи не "нанс", все должно быть хорошо.
Так что не имеет значения, какой столбец я использую для «значения», если в каждой строке есть значение, поскольку оно подсчитывает записи, а не числовые значения?