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/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel