[I'm bringing this back to the list.  Hope you don't mind.]

I've been doing a lot of non-matplotlib work lately and this fell off my 
radar.  Thanks for the reminder.

The patch looks good to me.  I'm not concerned about doing all this in 
_get_handles as opposed to Legend.__init__.  I actually think it's 
better in _get_handles because then it's more connected to the creation 
of the handles themselves.  (And of course _get_handles is only ever 
called from __init__ anyway, so it really is just an organizational 
extension of __init__).  I moved all references to _xdata to 
_get_handles to be consistent.

The one concern I had is that _xdata is being stored as a member 
variable, which implicitly assumes that it will be the same for all 
handles.  After your patch, it can be different for each handle -- for 
instance a line made of markers vs. dashing.  So I've just made it a 
local variable to _get_handles and recreate it separately for each 
handle.  There's no reason to try to share something so small, and it 
just feels safer (fewer potential side effects) that way.

I've committed this in r4871.  Please check it out and kick the tires 
with all the test cases you came up with along the way and let me know 
how it goes.

Cheers,
Mike

Paul Novak wrote:
> Mike,
> 
> Thank you for handling the PS backend issues. Below is an email I sent 
> earlier about an updated patch for fixing legends with numpoints=1; I 
> didn't get any response probably because of my delay in responding. If I 
> should restart this thread on the mailing list, I can.
> 
> 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:
>> Thanks for pointing that out -- I didn't even notice.
>>
>> There was an ordering problem in how colors were being set.  This 
>> should be fixed in r4870.
>>
>> Cheers,
>> Mike
>>
>> Paul Novak wrote:
>>> I have another problem after updating to SVN r4869. The ticks take 
>>> the color of the plotted line without regard to the default. For 
>>> example,
>>>
>>> matplotlib.rc('xtick', color='black')
>>> matplotlib.rc('ytick', color='black')
>>> plot(x, y, 'red')
>>>
>>> will give red ticks.
>>>
>>> Paul
>>>
>>> Michael Droettboom wrote:
>>>> It's a bug.  It's now possible for rgba colors to make their way all 
>>>> the way down to that level, so the code needs to truncate that to 
>>>> rgb (Ps can't handle alpha anyway).
>>>>
>>>> This is committed in SVN r4869.
>>>>
>>>> Cheers,
>>>> Mike
>>>>
>>>> Paul Novak wrote:
>>>>> Hello,
>>>>>
>>>>> I am trying to use the PS backend to make some simple line plots, 
>>>>> using the following script, but I get the error messages included 
>>>>> below when I try to plot with usetex=True. I have also included the 
>>>>> output from --verbose=helpful. I am using the current SVN, and I 
>>>>> don't recall having this problem when using 0.91.1.
>>>>>
>>>>> Thanks,
>>>>> Paul
>>>>>
>>>>> ---
>>>>> #!/usr/bin/env python
>>>>>
>>>>> import matplotlib
>>>>> matplotlib.use('PS')
>>>>> matplotlib.rc('text', usetex = 'True')
>>>>> from pylab import *
>>>>>
>>>>> x = arange(0,5)
>>>>> y = 2 * x
>>>>> figure(1)
>>>>> plot(x, y)
>>>>> savefig('psfig')
>>>>> show()
>>>>>
>>>>> ---
>>>>> $HOME=/home/pnovak
>>>>> CONFIGDIR=/home/pnovak/.matplotlib
>>>>> matplotlib data path 
>>>>> /usr/lib/python2.5/site-packages/matplotlib/mpl-data
>>>>> loaded rc file /home/pnovak/.matplotlib/matplotlibrc
>>>>> matplotlib version 0.98pre
>>>>> verbose.level helpful
>>>>> interactive is False
>>>>> units is False
>>>>> platform is linux2
>>>>> numerix numpy 1.0.3.1
>>>>> Using fontManager instance from 
>>>>> /home/pnovak/.matplotlib/fontManager.cache
>>>>> backend PS version Level II
>>>>> Found dvipng version 1.5
>>>>>
>>>>> Traceback (most recent call last):
>>>>>    File "junk.py", line 15, in <module>
>>>>>      savefig('psfig')
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/pyplot.py", 
>>>>> line 271, in savefig
>>>>>      return fig.savefig(*args, **kwargs)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/figure.py", 
>>>>> line 854, in savefig
>>>>>      self.canvas.print_figure(*args, **kwargs)
>>>>>    File 
>>>>> "/usr/lib/python2.5/site-packages/matplotlib/backend_bases.py", 
>>>>> line 1085, in print_figure
>>>>>      **kwargs)
>>>>>    File 
>>>>> "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_ps.py", 
>>>>> line 837, in print_ps
>>>>>      return self._print_ps(outfile, 'ps', *args, **kwargs)
>>>>>    File 
>>>>> "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_ps.py", 
>>>>> line 863, in _print_ps
>>>>>      orientation, isLandscape, papertype)
>>>>>    File 
>>>>> "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_ps.py", 
>>>>> line 1051, in _print_figure_tex
>>>>>      self.figure.draw(renderer)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/figure.py", 
>>>>> line 698, in draw
>>>>>      for a in self.axes: a.draw(renderer)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/axes.py", line 
>>>>> 1397, in draw
>>>>>      a.draw(renderer)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/axis.py", line 
>>>>> 680, in draw
>>>>>      tick.draw(renderer)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/axis.py", line 
>>>>> 179, in draw
>>>>>      self.label1.draw(renderer)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/text.py", line 
>>>>> 761, in draw
>>>>>      Text.draw(self, renderer)
>>>>>    File "/usr/lib/python2.5/site-packages/matplotlib/text.py", line 
>>>>> 309, in draw
>>>>>      self._fontproperties, angle)
>>>>>    File 
>>>>> "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_ps.py", 
>>>>> line 544, in draw_tex
>>>>>      color = '%1.3f,%1.3f,%1.3f'% gc.get_rgb()
>>>>> TypeError: not all arguments converted during string formatting
>>>>>
>>>>> ------------------------------------------------------------------------- 
>>>>>
>>>>> This SF.net email is sponsored by: Microsoft
>>>>> Defy all challenges. Microsoft(R) Visual Studio 2008.
>>>>> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
>>>>> _______________________________________________
>>>>> Matplotlib-users mailing list
>>>>> Matplotlib-users@lists.sourceforge.net
>>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>>
>>

-- 
Michael Droettboom
Science Software Branch
Operations and Engineering Division
Space Telescope Science Institute
Operated by AURA for NASA

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to