2012-07-05 61 views
18

Tengo un pandas DataFrame y quiero trazar un gráfico de barras que incluya una leyenda.Gráfico de barras pandas con colores específicos y ubicación de la leyenda?

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})}) 

Si llamo directamente trama, entonces se pone la leyenda por encima de la trama:

x.plot(kind="bar") 

Si giro de la leyenda en la trama y tratar de añadirlo más tarde, entonces no lo hace conservar los colores asociados a las dos columnas de la trama de datos (véase más adelante):

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

¿Cuál es la forma correcta de incluir una leyenda en una parcela matplotlib de una trama de datos pandas? enter image description here

+0

puedo obtener los mismos colores en ambas ocasiones. – eumiro

+0

Estoy usando Python 2.6.6, IPython 0.10.1 y Pandas 0.7.0.dev-2546ac7. @eumiro: ¿Recibes dos colores diferentes en ambas versiones? Mi segundo comando muestra ambos como del mismo color. – Shane

+0

Python2.7, Pandas 0.7.0. Ambos enfoques devuelven las mismas barras rojo-verdes con la misma leyenda rojo-verde. No es la leyenda roja-roja como en tu captura de pantalla. Lo siento, no tengo idea. – eumiro

Respuesta

24

Si desea agregar la leyenda manualmente, tiene que pedir a la subtrama de los elementos del diagrama de barras:

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> 

Además, plt.legend(loc='best') o ax.legend(loc='best') debe "sólo trabajo", porque hay ya se "vincula" a los parches del diagrama de barras configurados cuando se realiza el trazado, por lo que no es necesario pasar una lista de etiquetas de ejes.

No estoy seguro de si la versión de pandas que está usando devuelve un identificador a la subtrama (ax = ...) pero estoy bastante seguro de que 0.7.3 sí lo hace. Siempre puede obtener una referencia con plt.gca().

+3

Eso funcionó, ¡gracias! Sería bueno poder especificar la ubicación de la leyenda directamente al llamar a x.plot(). – Shane

+0

Además, ¿hay alguna forma de especificar atributos como 'color = '# 336699', alpha = 0.5' para barras múltiples en un diagrama de DataFrame? – Shane

21

La forma más sucinta que ir es:

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

o en general

x.plot(kind="bar").legend(*args, **kwargs) 
Cuestiones relacionadas