2013-02-12 7 views
19

Robię ułożone bar działkę przy użyciu:Edit szerokość barów korzystających dataframe.plot() funkcja w matplotlib

DataFrame.plot(kind='bar',stacked=True) 

chcę kontrolować szerokość prętów tak, że pręty są połączone ze sobą jak histogram.

Przejrzałem dokumentację, ale bez rezultatu - jakieś sugestie? Czy można to zrobić w ten sposób?

+0

* chcesz * przekazać szerokość = 1 (do baru), ale działka nie pozwoli ci ...: s –

+0

Dziwne. Słowo kluczowe align zachowuje się jak przeciwieństwo mpl, a słowo log jest również dziwne. @Osmond, chciałbym obejść go przy użyciu: ax.bar (df.index.values, df.values) –

+0

Zobacz [ta odpowiedź] (https://stackoverflow.com/a/27321764/577088) dla najbardziej up- aktualna odpowiedź. Przyjęta odpowiedź jest dość nieaktualna. – senderle

Odpowiedz

40

Dla każdego, napotykając to pytanie:

Od pand 0,14, wykreślając z barów ma „szerokość” polecenie: https://github.com/pydata/pandas/pull/6644

powyższy przykład można teraz łatwo rozwiązać poprzez zastosowanie

df.plot(kind='bar', stacked=True, width=1) 
12

Jeśli uważasz, że musisz "przetworzyć" pręt z matplotlib jako pandy wewnętrznie ustawia szerokość prętów.

Prostokąty tworzące pręty znajdują się w obiektach kontenerowych. Więc trzeba iterację tych pojemników i ustawić szerokość prostokątów indywidualnie:

In [208]: df = pd.DataFrame(np.random.random((6, 5)) * 10,    
         index=list('abcdef'), columns=list('ABCDE')) 

In [209]: df 
Out[209]: 
    A B C D E 
a 4.2 6.7 1.0 7.1 1.4 
b 1.3 9.5 5.1 7.3 5.6 
c 8.9 5.0 5.0 6.7 3.8 
d 5.5 0.5 2.4 8.4 6.4 
e 0.3 1.4 4.8 1.7 9.3 
f 3.3 0.2 6.9 8.0 6.1 

In [210]: ax = df.plot(kind='bar', stacked=True, align='center') 

In [211]: for container in ax.containers: 
       plt.setp(container, width=1) 
    .....:   

In [212]: x0, x1 = ax.get_xlim() 

In [213]: ax.set_xlim(x0 -0.5, x1 + 0.25) 
Out[213]: (-0.5, 6.5) 

In [214]: plt.tight_layout() 

stacked_bar.png

+1

ładna odpowiedź. Nie zdawałem sobie sprawy, że "postprocessing" jest opcją – zach

+0

Używam df.plot do overplot dodatkowych słupków na istniejącym wykresie słupkowym. @ bmu, twoja metoda nie działa dla mnie, ponieważ zmienia wszystkie stare obiekty fabuły, oprócz nowych. Jak zmienić szerokość taktów nowo utworzonych przez df.plot()? – CPBL

+0

@ ChristopherBarrington-Leigh Być może można rozpocząć iterację obiektów kontenera na późniejszym indeksie (pod numerem poprzednich obiektów kontenera), jednak przykład będzie lepszy. Myślę, że powinieneś lepiej zapytać o to w osobnym pytaniu. – bmu

Powiązane problemy