I am trying to use pick event. See the simple script
below. I am interested to find the shortest distance between pick
point (mouse coord.) and the line at the discrete points only (points on
the curve from data)
What am I doing wrong ?
Regards,
Arek
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import math as math
# create figure and attach axes to it
fig = plt.figure(1)
ax = fig.add_subplot(111)
def getMinDistance(xmouse, ymouse, xList, yList):
"""
find shortest distance between mouse
coordinates and pick point
point pick may be a list of points if
data is clouded
Input
xmouse - x coordinate of mouse (x - pick)
ymouse - y coordinate of mouse (y - pick)
xList - xData from curve
yList - yData from curve
Returns:
dmin - minimum distance
index - index of data point in the xList
and yList
"""
dmin = math.sqrt((xList[0] -
xmouse)**2. + (yList[0]-ymouse)**2.)
index = 0
for idx in range(1,len(xList)):
d =
math.sqrt((xList[idx] - xmouse)**2. + (yList[idx]-ymouse)**2.)
if(d < dmin):
dmin = d
index = idx
return dmin, index
def showMarker(x, y, color):
"""
draw marker at loction x, y with color
"""
# draw marker
markerOn, = ax.plot(x, y, 'o', color =
color)
def OnPick(event):
"""
pick event
"""
print '****************************'
mouseEvent = event.mouseevent
# get pick coord
xmouse, ymouse = mouseEvent.xdata,
mouseEvent.ydata
# get the artist
lineObj = event.artist
print lineObj
if not isinstance(lineObj, Line2D):
return
ind = event.ind
# check if indexes exist of the pick
object
N = len(ind)
if not N:
return
# get curve picked data
Xdata, Ydata = lineObj.get_data()
color = lineObj.get_color()
xLi = np.take(Xdata, ind)
yLi = np.take(Ydata, ind)
dmin, index = getMinDistance(xmouse,
ymouse, xLi, yLi)
xP = xLi[index]
yP = yLi[index]
xStr = '%.4g' % xP
yStr = '%.4g' % yP
txt = 'X = ' + xStr + ' ; ' + 'Y =
' + yStr
print txt
# show marker
showMarker(xP, yP, color)
# redraw to show marker
fig.canvas.draw()
# connect to pick event
fig.canvas.mpl_connect('pick_event',OnPick)
# generate data for display
x = np.arange(-4,4,0.1) # x-
coord
y2 = x**2 + 5.0
# y coord of first curve
y = 2*x +
4.0
# y coord of the second curve
# create the list of x and y data
xList = [x,
x]
yList = [y, y2]
objList = [] # store draw lines
(artists)
# display 2 curves
for idx in range(len(xList)):
obj, = ax.plot(xList[idx], yList[idx],
picker = 5)
objList.append(obj)
# display plot
plt.show(1)
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users