Included below is an updated patch fixing the legend with numpoints=1. 
The patch has been made against SVN and works for Line2D, 
LineCollection, Patch, and RegularPolyCollection. The patch could be merged.

I also think the patch could be improved. Currently, handle._marker is 
examined to determine if the legend should contain lines or symbols, but 
this is done in the _get_handles function. It would be better if that 
could be moved into the Legend class definition, however, I do not know 
how to examine handle._marker in the Legend class definition.

Again, I would appreciate any comments or improvements.

Thanks,

Paul

diff -u a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py
--- a/lib/matplotlib/legend.py  2008-01-09 13:11:00.000000000 -0600
+++ b/lib/matplotlib/legend.py  2008-01-09 13:08:36.000000000 -0600
@@ -175,9 +175,7 @@
          # make a trial box in the middle of the axes.  relocate it
          # based on it's bbox
          left, top = 0.5, 0.5
-        if self.numpoints == 1:
-            self._xdata = npy.array([left + self.handlelen*0.5])
-        else:
+        if self.numpoints > 1:
              self._xdata = npy.linspace(left, left + self.handlelen, 
self.numpoints)
          textleft = left+ self.handlelen+self.handletextsep
          self.texts = self._get_texts(labels, textleft, top)
@@ -236,6 +234,7 @@

      def _get_handles(self, handles, texts):
          HEIGHT = self._approx_text_height()
+        left = 0.5

          ret = []   # the returned legend lines

@@ -243,6 +242,10 @@
              x, y = label.get_position()
              x -= self.handlelen + self.handletextsep
              if isinstance(handle, Line2D):
+                if self.numpoints == 1 and handle._marker == 'None':
+                    self._xdata = npy.linspace(left, left + 
self.handlelen, 2)
+                elif self.numpoints == 1:
+                    self._xdata = npy.array([left + self.handlelen*0.5])
                  ydata = (y-HEIGHT/2)*npy.ones(self._xdata.shape, float)
                  legline = Line2D(self._xdata, ydata)
                  legline.update_from(handle)
@@ -253,7 +256,8 @@

                  ret.append(legline)
              elif isinstance(handle, Patch):
-
+                if self.numpoints == 1:
+                    self._xdata = npy.linspace(left, left + 
self.handlelen, 2)
                  p = Rectangle(xy=(min(self._xdata), y-3/4*HEIGHT),
                                width = self.handlelen, height=HEIGHT/2,
                                )
@@ -263,6 +267,8 @@
                  p.set_clip_path(None)
                  ret.append(p)
              elif isinstance(handle, LineCollection):
+                if self.numpoints == 1:
+                    self._xdata = npy.linspace(left, left + 
self.handlelen, 2)
                  ydata = (y-HEIGHT/2)*npy.ones(self._xdata.shape, float)
                  legline = Line2D(self._xdata, ydata)
                  self._set_artist_props(legline)
@@ -277,6 +283,8 @@
                  ret.append(legline)

              elif isinstance(handle, RegularPolyCollection):
+                if self.numpoints == 1:
+                    self._xdata = npy.array([left])
                  p = Rectangle(xy=(min(self._xdata), y-3/4*HEIGHT),
                                width = self.handlelen, height=HEIGHT/2,
                                )


Michael Droettboom wrote:
> I'm sure the radio silence to your question is just due to holidays.
> 
> Thanks for looking into this.  I'd be happy to incorporate your patch 
> when it is ready.
> 
> As for your question about plots that can include patches -- patches are 
> virtually anything plotted that aren't lines or images.  This includes 
> rectangles, polygons and ellipses, for instance.  See something like 
> ellipse_demo.py for an example.  Patches are always drawn as rectangles 
> in the legend.
> 
> Cheers,
> Mike
> 

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to