Re: [matplotlib-devel] Patch for making SpanSelector usable in embedded matplotlib

2008-02-18 Thread Erik Tollerud
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

2008-02-18 Thread Andrew Straw
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