Hi Ben,

Thanks for your nicer and working code! It works perfectly and is indeed clean.
Up to now I didn't noticed any problem with the positioning of the legend.
Best regards,

Alain

From: ben.v.r...@gmail.com [mailto:ben.v.r...@gmail.com] On Behalf Of Benjamin 
Root
Sent: Thursday, 06 January, 2011 04:43
To: Alain Pascal Frances
Cc: matplotlib-users@lists.sourceforge.net
Subject: Re: [Matplotlib-users] Legend in a multibars chart

On Wed, Jan 5, 2011 at 7:19 AM, Alain Pascal Frances 
<frances17...@itc.nl<mailto:frances17...@itc.nl>> wrote:
Hi,

I'm plotting two subplots using bar charts, the first one contains one dataset 
(one bar for each abscissa value), the second 3 dataset (3 bars for each 
abscissa value, each one with its own color). The legend of the multibars chart 
is not correct, it shows the color of the first dataset for all the bars legend.
Note that it works correctly with matplotlib.pyplot.plot instead of 
matplotlib.pyplot.bar.
Any idea to fix it?
Thanks,

A.Frances

I can confirm the problem, and I have a few suspects as to the cause.  Most 
notably that the legend code probably assumes that it is looking for line 
objects, not patch objects and starts using its own color cycler when it can't 
get a list of colors to correspond with its list of labels.

As a work-around, you can add a label keyword to the call to bar() and not 
bother giving legend() a list of labels.

Here is a cleaned-up version of your first code.  Note I also took a moment to 
take advantage of python syntax and better numpy/matplotlib coding styles. The 
only issue seems to be that there might be a bug with respect to positioning 
the legend:

import matplotlib.pyplot as plt
import numpy as np

strTitle = 'Bars plot - multi data and legend'
x = np.arange(10)
y1 = 1.0 + np.random.random(x.shape)
y2 = 0.5 + np.random.random((3, len(x)))

lbl_y1 = 'bar 1'
lbl_type = ['red', 'green', 'blue']
colors_y2 = ([1,0,0],[0,1,0],[0,0,1])
lbls_y2 = ["bar 2 " + lbl for lbl in lbl_type]

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.set_title("Single data")
ax1.bar(x, y1, color='purple', linewidth=0, align='edge', width=0.8, 
label=lbl_y1)
ax1.legend(loc=0)
ax1.set_xticks(x)

ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax2.set_title("Multi data")
for i, (y, color, lbl) in enumerate(zip(y2, colors_y2, lbls_y2)) :
   ax2.bar(x+(0.8*float(i)/len(y2)), y, color=color, label=lbl, linewidth=0, 
align='edge', width=(0.8/len(y2)))
ax2.legend(loc=0)

fig.subplots_adjust(left=0.05, bottom=0.1, right=0.95, top=0.95, wspace=0.1, 
hspace=0.15)

plt.show()

I hope this helps!
Ben Root

------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to