[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.5ret = # 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,
MikePaul 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,
MikePaul 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 pythonimport 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.5Traceback (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
matplotlib-users List Signup and Options
--
Michael Droettboom
Science Software Branch
Operations and Engineering Division
Space Telescope Science Institute
Operated by AURA for NASA