Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas bar plot with specific colors and legend location?

I have a pandas DataFrame and I want to plot a bar chart that includes a legend.

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

If I call plot directly, then it puts the legend above the plot:

x.plot(kind="bar")

If I turn of the legend in the plot and try to add it later, then it doesn't retain the colors associated with the two columns in the DataFrame (see below):

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

What's the right way to include a legend in a matplotlib plot from a Pandas DataFrame? enter image description here

like image 557
Shane Avatar asked Jul 05 '12 15:07

Shane


2 Answers

The most succinct way to go is:

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

or in general

x.plot(kind="bar").legend(*args, **kwargs)
like image 130
Piotr Migdal Avatar answered Oct 20 '22 12:10

Piotr Migdal


If you want to add the legend manually, you have to ask the subplot for the elements of the bar plot:

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>

Also, plt.legend(loc='best') or ax.legend(loc='best') should "just work", because there are already "links" to the bar plot patches set up when the plot is made, so you don't have to pass a list of axis labels.

I'm not sure if the version of pandas you're using returns a handle to the subplot (ax = ...) but I'm fairly certain that 0.7.3 does. You can always get a reference to it with plt.gca().

like image 33
Wes McKinney Avatar answered Oct 20 '22 12:10

Wes McKinney