Я хотел бы сравнить две гистограммы, указав, что ось Y показывает процент каждого столбца из общего размера набора данных вместо абсолютного значения. Это возможно? Я использую Pandas и matplotlib. Благодаря
Есть ли параметр в matplotlib/pandas, чтобы иметь ось Y гистограммы в процентах?
Ответ 1
normed=True
возвращает гистограмму, для которой np.sum(pdf * np.diff(bins))
равно 1. Если вы хотите, чтобы сумма гистограммы равнялась 1, вы можете использовать гистограмму Numpy() и сами нормализовать результаты.
x = np.random.randn(30)
fig, ax = plt.subplots(1,2, figsize=(10,4))
ax[0].hist(x, normed=True, color='grey')
hist, bins = np.histogram(x)
ax[1].bar(bins[:-1], hist.astype(np.float32) / hist.sum(), width=(bins[1]-bins[0]), color='grey')
ax[0].set_title('normed=True')
ax[1].set_title('hist = hist / hist.sum()')
Btw: странный заговор с ошибкой в первом бункере левого сюжета.
Ответ 2
Pandas plotting может принимать любые дополнительные аргументы ключевого слова из соответствующей функции matplotlib. Итак, для полноты из комментариев других здесь, вот как это можно сделать:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(100,2), columns=list('AB'))
df.hist(normed=1)
Кроме того, для прямого сравнения это может быть хорошим способом:
df.plot(kind='hist', normed=1, bins=20, stacked=False, alpha=.5)
Ответ 3
Похоже, что @CarstenKönig нашел правильный путь:
df.hist(bins=20, weights=np.ones_like(df[df.columns[0]]) * 100. / len(df))
Ответ 4
Вы можете упростить взвешивание, используя np.ones_like():
df["ColumnName"].plot.hist(weights = np.ones_like(df.index) / len(df.index))
- np.ones_like() в порядке с структурой df.index
- len (df.index) быстрее для больших DataFrames