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

Reply via email to