2012-07-05 12 views
18

Ho un panda DataFrame e voglio tracciare un grafico a barre che include una legenda.Grafico della barra di Pandas con colori specifici e posizione della legenda?

import pylab as pl 
from pandas import * 

x = DataFrame({"Alpha": Series({1: 1, 2: 3, 3:2.5}), "Beta": Series({1: 2, 2: 2, 3:3.5})}) 

Se chiamo direttamente trama, poi mette la leggenda sopra la trama:

x.plot(kind="bar") 

Se mi volto della leggenda nella trama e provo ad aggiungere in un secondo momento, quindi non è così mantenere i colori associati alle due colonne della dataframe (vedi sotto):

x.plot(kind="bar", legend=False) 
l = pl.legend(('Alpha','Beta'), loc='best') 

Qual è il modo giusto per includere una leggenda in una trama matplotlib da un Pandas dataframe? enter image description here

+0

ottengo gli stessi colori entrambe le volte. – eumiro

+0

Sto usando Python 2.6.6, IPython 0.10.1 e Pandas 0.7.0.dev-2546ac7. @ eumiro: ottieni due colori diversi in entrambe le versioni? Il mio secondo comando mostra entrambi come lo stesso colore. – Shane

+0

Python2.7, Pandas 0.7.0. Entrambi i tuoi approcci restituiscono le stesse barre rosso-verdi con la stessa leggenda rosso-verde. Non la leggenda rosso-rossa come nel tuo screenshot. Scusa, non ne ho idea. – eumiro

risposta

24

Se si desidera aggiungere alla leggenda manualmente, si deve chiedere la sottotrama per gli elementi della trama bar:

In [17]: ax = x.plot(kind='bar', legend=False) 

In [18]: patches, labels = ax.get_legend_handles_labels() 

In [19]: ax.legend(patches, labels, loc='best') 
Out[19]: <matplotlib.legend.Legend at 0x10b292ad0> 

Inoltre, plt.legend(loc='best') o ax.legend(loc='best') dovrebbe "solo lavoro", perché ci sono già "link" alle patch del grafico a barre impostate quando viene creato il grafico, quindi non è necessario passare un elenco di etichette degli assi.

Non sono sicuro che la versione dei panda in uso restituisca un handle alla sottotrama (ax = ...) ma sono abbastanza certo che lo sia 0.7.3. È sempre possibile ottenere un riferimento ad esso con plt.gca().

+3

Ha funzionato, grazie! Sarebbe bello poter specificare direttamente la posizione della legenda quando si chiama x.plot(). – Shane

+0

Inoltre, c'è un modo per specificare attributi come 'color = '# 336699', alpha = 0.5' per più barre in un grafico DataFrame? – Shane

21

Il modo più sintetico per andare è:

x.plot(kind="bar").legend(bbox_to_anchor=(1.2, 0.5)) 

o in generale

x.plot(kind="bar").legend(*args, **kwargs) 
Problemi correlati