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)