2013-02-12 10 views
19

Sto facendo un grafico a barre in pila utilizzando:Modificare la larghezza delle barre utilizzando dataframe.plot() in matplotlib

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

Voglio controllare la larghezza delle barre in modo che le barre sono collegate tra loro come un istogramma.

Ho esaminato la documentazione ma senza risultati - qualche suggerimento? È possibile farlo in questo modo?

+0

Si * si desidera * passare in larghezza = 1 (su barra) ma il grafico non consente di ...: s –

+0

Strano. La parola chiave align si comporta come l'opposto di mpl e anche la parola chiave log è strana. @Osmond, lo risolverei usando: ax.bar (df.index.values, df.values) –

+0

Vedere [questa risposta] (https://stackoverflow.com/a/27321764/577088) per i più recenti risposta attuale. La risposta accettata è abbastanza antiquata. – senderle

risposta

40

Per chiunque imbattersi in questa domanda:

Dal panda 0,14, tracciando con barre ha un comando 'larghezza': https://github.com/pydata/pandas/pull/6644

L'esempio sopra può ora essere risolto semplicemente utilizzando

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

Se si pensa di dover "postelaborare" il barplot con matplotlib, i panda internamente impostano la larghezza delle barre.

I rettangoli che formano le barre sono in oggetti contenitore. quindi bisogna scorrere questi contenitori e impostare la larghezza dei rettangoli singolarmente:

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

bella risposta. Non avevo capito che "postprocessing" era un'opzione – zach

+0

Sto usando df.plot per sovrascrivere barre aggiuntive su un grafico a barre preesistente. @ bmu, il tuo metodo non funziona per me perché cambia tutti i vecchi oggetti della trama, oltre a quelli nuovi. Come cambiare la larghezza delle sole barre create da df.plot()? – CPBL

+0

@ ChristopherBarrington-Leigh Forse è possibile avviare l'iterazione sugli oggetti contenitore in un indice successivo (al numero degli oggetti contenitore precedenti), tuttavia un esempio potrebbe essere migliore. Penso che dovresti fare meglio a questa domanda in una domanda separata. – bmu

Problemi correlati