Re: [matplotlib-devel] Patch for making SpanSelector usable in embedded matplotlib
You're absolutely correct - I wrote the original patch against 91.2, and forgot to test it against the new trunk. Below is a new patch that HAS been tested against the trunk version. It includes another fix for some API changes in the Rectangle object. Note that there's also a fix in the RectangleSelector to prevent it from raising an exception under the new API. I've also noticed that both the SpanSelector and RectangleSelector don't seem to draw the rectangle with useblit=False on my machine - I'm only using useblit=True, though, and it works fine there with the alterations in this patch. Index: widgets.py === --- widgets.py (revision 4953) +++ widgets.py (working copy) @@ -827,16 +827,14 @@ assert direction in ['horizontal', 'vertical'], 'Must choose horizontal or vertical for direction' self.direction = direction -self.ax = ax +self.ax = None +self.canvas = None self.visible = True -self.canvas = ax.figure.canvas -self.canvas.mpl_connect('motion_notify_event', self.onmove) -self.canvas.mpl_connect('button_press_event', self.press) -self.canvas.mpl_connect('button_release_event', self.release) -self.canvas.mpl_connect('draw_event', self.update_background) +self.cids=[] self.rect = None self.background = None +self.pressv = None self.rectprops = rectprops self.onselect = onselect @@ -847,8 +845,23 @@ # Needed when dragging out of axes self.buttonDown = False self.prev = (0, 0) - -if self.direction == 'horizontal': + +self.new_axes(ax) + + +def new_axes(self,ax): +self.ax = ax +if self.canvas is not ax.figure.canvas: +for cid in self.cids: +self.canvas.mpl_disconnect(cid) + +self.canvas = ax.figure.canvas + +self.cids.append(self.canvas.mpl_connect('motion_notify_event', self.onmove)) +self.cids.append(self.canvas.mpl_connect('button_press_event', self.press)) + self.cids.append(self.canvas.mpl_connect('button_release_event', self.release)) + self.cids.append(self.canvas.mpl_connect('draw_event', self.update_background)) + if self.direction == 'horizontal': trans = blended_transform_factory(self.ax.transData, self.ax.transAxes) w,h = 0,1 else: @@ -859,9 +872,8 @@ visible=False, **self.rectprops ) - + if not self.useblit: self.ax.add_patch(self.rect) -self.pressv = None def update_background(self, event): 'force an update of the background' @@ -931,10 +943,10 @@ minv, maxv = v, self.pressv if minv>maxv: minv, maxv = maxv, minv if self.direction == 'horizontal': -self.rect.xy[0] = minv +self.rect.set_x(minv) self.rect.set_width(maxv-minv) else: -self.rect.xy[1] = minv +self.rect.set_y(minv) self.rect.set_height(maxv-minv) if self.onmove_callback is not None: @@ -1155,8 +1167,8 @@ miny, maxy = self.eventpress.ydata, y # click-y and actual mouse-y if minx>maxx: minx, maxx = maxx, minx # get them in the right order if miny>maxy: miny, maxy = maxy, miny -self.to_draw.xy[0] = minx # set lower left of box -self.to_draw.xy[1] = miny +self.to_draw.set_x(minx) # set lower left of box +self.to_draw.set_y(miny) self.to_draw.set_width(maxx-minx) # set width and height of box self.to_draw.set_height(maxy-miny) self.update() On Feb 11, 2008 7:48 AM, John Hunter <[EMAIL PROTECTED]> wrote: > On Feb 10, 2008 5:12 PM, Erik Tollerud <[EMAIL PROTECTED]> wrote: > > I've been working on an application that uses matplotlib as its > > plotting library, and I've been noticing a steady decrease in > > It looks like there is some confusion in your patch vis-a-vis the > migration from the old matplotlib transformation architecture (no on a > branch) to the new (now in the trunk). I'm attaching the migration > document. For example, your patch removes > blended_transform_factory lines (new transforms call on the trunk) and > adds blend_xy_sep_transform lines (old transforms call on the 0.91 > maintenance branch). > > You can patch either the maintenance branch or the trunk or both, but > I think the patch as submitted is a little mixed up if I am reading > this correctly. > > JDH > -- Erik Tollerud Graduate Student Center For Cosmology Department of Physics and Astronomy 4155B Frederick Reines Hall University of California, Irvine Office Phone: (949)824-2996 Cell: (651)307-9409 [EMAIL PROTECTED] Index: widgets.py =
[matplotlib-devel] picking bug in SVN with old masked array
I just ran into a bug with picking of lines. I changed the line style in figure 1, subplot 1 to 'o-' (from 'o') and ripped out most of everything else in examples/pick_event_demo.py to create pick_event_demo3.py (attached). When I run this and I attempt to click on points, I get Traceback (most recent call last): File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/backends/backend_gtk.py", line 193, in button_press_event FigureCanvasBase.button_press_event(self, x, y, event.button) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/backend_bases.py", line 915, in button_press_event self.callbacks.process(s, mouseevent) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/cbook.py", line 157, in process func(*args, **kwargs) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/backend_bases.py", line 849, in pick self.figure.pick(mouseevent) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/artist.py", line 220, in pick for a in self.get_children(): a.pick(mouseevent) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/axes.py", line 2155, in pick martist.Artist.pick(self,args[0]) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/artist.py", line 220, in pick for a in self.get_children(): a.pick(mouseevent) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/artist.py", line 214, in pick inside,prop = self.contains(mouseevent) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/lines.py", line 327, in contains ind = segment_hits(mouseevent.x,mouseevent.y,xt,yt,pixels) File "/home/astraw/py2.5-linux-x86_64/lib/python2.5/site-packages/matplotlib/lines.py", line 100, in segment_hits candidates = candidates & ~point_hits[:-1] & ~point_hits[1:] TypeError: bad operand type for unary ~: 'MaskedArray' Anyhow, I spent a little while tracking this down and came up with the attached patch. I guess there's a more direct solution to the issue that this band-aid, but I hope this will jump-start someone to fix this. In the meantime, this appears to work sufficiently for my purposes... FWIW, my numpy is SVN from 16 december 2007 (after 1.0.4 and thus on the way to 1.0.5) and I'm using the old ma module. BUILDING MATPLOTLIB matplotlib: 0.98pre python: 2.5.1 (r251:54863, Oct 5 2007, 13:50:07) [GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] platform: linux2 REQUIRED DEPENDENCIES numpy: 1.0.5.dev freetype2: 9.16.3 #!/usr/bin/env python from matplotlib.pyplot import figure, show from matplotlib.lines import Line2D import numpy as npy from numpy.random import rand if 1: fig = figure() ax1 = fig.add_subplot(111) line, = ax1.plot(rand(100), 'o-', picker=5) # 5 points tolerance def onpick1(event): if isinstance(event.artist, Line2D): thisline = event.artist xdata = thisline.get_xdata() ydata = thisline.get_ydata() ind = event.ind print 'onpick1 line:', zip(npy.take(xdata, ind), npy.take(ydata, ind)) fig.canvas.mpl_connect('pick_event', onpick1) show() Index: lib/matplotlib/lines.py === --- lib/matplotlib/lines.py (revision 4976) +++ lib/matplotlib/lines.py (working copy) @@ -71,6 +71,14 @@ ic1 = breakpoints return npy.concatenate((ic0[:, npy.newaxis], ic1[:, npy.newaxis]), axis=1) +def unmask_if_safe(x): +if not ma.isMaskedArray(x): +return x +m = ma.getmask(x) +if npy.sum(m) == 0: +x = npy.asarray(x) +return x + def segment_hits(cx,cy,x,y,radius): """Determine if any line segments are within radius of a point. Returns the list of line segments that are within that radius. @@ -312,6 +320,9 @@ xt = xyt[:, 0] yt = xyt[:, 1] +xt = unmask_if_safe(xt) +yt = unmask_if_safe(yt) + if self.figure == None: print str(self),' has no figure set' pixels = self.pickradius - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/___ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel