Подтвердить что ты не робот

Есть ли параметр в matplotlib/pandas, чтобы иметь ось Y гистограммы в процентах?

Я хотел бы сравнить две гистограммы, указав, что ось Y показывает процент каждого столбца из общего размера набора данных вместо абсолютного значения. Это возможно? Я использую Pandas и matplotlib. Благодаря

4b9b3361

Ответ 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()')

enter image description here

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)

Ответ 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