2013-07-26 12 views
24

Chciałbym porównać dwa histogramy, ponieważ oś Y pokazuje procent każdej kolumny z ogólnego rozmiaru zbioru danych zamiast wartości bezwzględnej. Czy to jest możliwe? Używam Pand i matplotlib. DziękiCzy istnieje parametr w matplotlib/pandas, który ma oś Y histogramu w procentach?

+5

Dodaj 'unormowanych = TRUE do' plt .hist() '. –

+1

Dzięki! z jakiegoś powodu ta opcja nie jest udokumentowana na http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.hist.html#pandas.DataFrame.hist. Otrzymuję jednak wartości na osi Y równe i większe niż 1 (np. 1,4). Masz pomysł, jak to możliwe? Moją intuicją było to, że po znormalizowaniu wartości powinny wynosić od 0 do 1. – d1337

+0

Po drugie ten problem! – robertevansanders

Odpowiedz

31

W normed=True Zwraca histogram dla których np.sum(pdf * np.diff(bins)) równa 1. Jeśli chcesz sumę histogramu być 1 można użyć histogramu NumPy użytkownika() i normalizacji wyników siebie.

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: Strange kreślenia usterki w pierwszym pojemniku z lewej działki.

+0

Świetnie, dzięki! – d1337

+0

Niesamowite (i taki dobry przykład, jak korzystać z subfigures) – grasshopper

+1

Czy mógłbyś wyjaśnić, dlaczego pandy zachowują się w ten sposób? Jestem trochę zdezorientowany. Myślę, że większość ludzi wybierałaby sumę = 1 sposób. – cqcn1991

9

Wykreślanie pand można zaakceptować wszelkie dodatkowe argumenty słów kluczowych z odpowiedniej funkcji matplotlib. Tak pod względem kompletności z uwagami innych tutaj, to jak można by to zrobić:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randn(100,2), columns=list('AB')) 

df.hist(normed=1) 

również do bezpośredniego porównania może to być dobry sposób, a także:

df.plot(kind='hist', normed=1, bins=20, stacked=False, alpha=.5) 
7

wygląda @ CarstenKönig found the right way:

df.hist(bins=20, weights=np.ones_like(df[df.columns[0]]) * 100./len(df)) 
+1

Myślę, że '100' został nieprawidłowo umieszczony. Poprawna wersja to 'df.hist (bin = 20, weight = np.ones_like (df [df.columns [0]]) * 100./len (df))', jeśli myślisz o czymś od 0 do 100. – fcpenha

+0

Rzeczywiście. Dobry połów! Poprawione. – hobs

3

można uprościć ważenia przy użyciu np.ones_like():

df["ColumnName"].plot.hist(weights = np.ones_like(df.index)/len(df.index)) 
  • np.ones_like() jest w porządku ze strukturą df.index
  • len (df.index) jest szybsza dla dużych DataFrames
Powiązane problemy