2014-08-28 14 views
13

Chciałbym utworzyć następujący histogram (patrz zdjęcie poniżej) zaczerpnięte z książki "Think Stats". Nie mogę jednak zdobyć ich na tej samej działce. Każda DataFrame ma swój własny wątek.Wiele histogramów w Pandach

Mam następujący kod:

import nsfg 
import matplotlib.pyplot as plt 
df = nsfg.ReadFemPreg() 
preg = nsfg.ReadFemPreg() 
live = preg[preg.outcome == 1] 

first = live[live.birthord == 1] 
others = live[live.birthord != 1] 

#fig = plt.figure() 
#ax1 = fig.add_subplot(111) 

first.hist(column = 'prglngth', bins = 40, color = 'teal', \ 
      alpha = 0.5) 
others.hist(column = 'prglngth', bins = 40, color = 'blue', \ 
      alpha = 0.5) 
plt.show() 

Powyższy kod nie działa, gdy używam Ax = AX1 jak zasugerowano w: pandas multiple plots not working as hists ani ten przykład robi to, czego potrzebuję: Overlaying multiple histograms using pandas. Kiedy używam tego kodu bez zmian, tworzy on dwa okna z histogramami. Jakieś pomysły, jak je połączyć?

Oto przykład tego, jak chciałbym ostateczna postać wyglądać: enter image description here

Odpowiedz

21

O ile mogę powiedzieć, pandy nie może obsłużyć tej sytuacji. To dobrze, ponieważ wszystkie ich metody kreślenia są tylko dla wygody. Będziesz musiał bezpośrednio użyć Matplotlib. Oto jak to zrobić:

%matplotlib inline 
import numpy as np 
import matplotlib.pyplot as plt 
import pandas 
#import seaborn 
#seaborn.set(style='ticks') 

np.random.seed(0) 
df = pandas.DataFrame(np.random.normal(size=(37,2)), columns=['A', 'B']) 
fig, ax = plt.subplots() 

a_heights, a_bins = np.histogram(df['A']) 
b_heights, b_bins = np.histogram(df['B'], bins=a_bins) 

width = (a_bins[1] - a_bins[0])/3 

ax.bar(a_bins[:-1], a_heights, width=width, facecolor='cornflowerblue') 
ax.bar(b_bins[:-1]+width, b_heights, width=width, facecolor='seagreen') 
#seaborn.despine(ax=ax, offset=10) 

i to daje mi: enter image description here

+0

W moim przypadku powoduje to dodanie przesunięcia do danych. To może nie być doceniane w przykładzie, ponieważ dane są losowe. Jednak nie mogę się dowiedzieć, gdzie jest błąd. – kiril

+0

Nie ma błędu, który mogę zobaczyć. Szerokość każdego pojemnika w histogramie jest reprezentowana przez łączną szerokość obu pasków. Nie jest to najczystszy sposób reprezentowania danych, ale zachowuje się zgodnie z oczekiwaniami. @kiril –

0

Oto fragment, w moim przypadku muszę jawnie określone pojemniki i zakres, ponieważ nie zajmowałem się usuwaniem zewnętrznym jako autorem książki.

fig, ax = plt.subplots() 
ax.hist([first.prglngth, others.prglngth], 10, (27, 50), histtype="bar", label=("First", "Other")) 
ax.set_title("Histogram") 
ax.legend() 

Skorzystaj z plotera Multiplot Matplotlib o różnych rozmiarach example.