The patch for legends works except for LineCollection. For any call to legend(), I get the errors below,
Paul Traceback (most recent call last): File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtk.py", line 331, in expose_event self._render_figure(self._pixmap, w, h) File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtkagg.py", line 75, in _render_figure FigureCanvasAgg.draw(self) File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_agg.py", line 257, in draw self.figure.draw(self.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/legend.py", line 206, in draw h.draw(renderer) File "/usr/lib/python2.5/site-packages/matplotlib/lines.py", line 480, in draw lineFunc(renderer, gc, tpath, affine.frozen()) File "/usr/lib/python2.5/site-packages/matplotlib/lines.py", line 740, in _draw_dashed renderer.draw_path(gc, path, trans) ValueError: Dash sequence must be an even length sequence; found 1 Traceback (most recent call last): File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtk.py", line 331, in expose_event self._render_figure(self._pixmap, w, h) File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtkagg.py", line 75, in _render_figure FigureCanvasAgg.draw(self) File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_agg.py", line 257, in draw self.figure.draw(self.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/legend.py", line 206, in draw h.draw(renderer) File "/usr/lib/python2.5/site-packages/matplotlib/lines.py", line 480, in draw lineFunc(renderer, gc, tpath, affine.frozen()) File "/usr/lib/python2.5/site-packages/matplotlib/lines.py", line 740, in _draw_dashed renderer.draw_path(gc, path, trans) ValueError: Dash sequence must be an even length sequence; found 1 Traceback (most recent call last): File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtk.py", line 331, in expose_event self._render_figure(self._pixmap, w, h) File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_gtkagg.py", line 75, in _render_figure FigureCanvasAgg.draw(self) File "/usr/lib/python2.5/site-packages/matplotlib/backends/backend_agg.py", line 257, in draw self.figure.draw(self.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/legend.py", line 206, in draw h.draw(renderer) File "/usr/lib/python2.5/site-packages/matplotlib/lines.py", line 480, in draw lineFunc(renderer, gc, tpath, affine.frozen()) File "/usr/lib/python2.5/site-packages/matplotlib/lines.py", line 740, in _draw_dashed renderer.draw_path(gc, path, trans) ValueError: Dash sequence must be an even length sequence; found 1 Michael Droettboom wrote: > [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 >>>>> >>> > ------------------------------------------------------------------------- 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