Pick event

What I am trying is to plot multiple discontinuous lines.

I know that this approach does not work very well. How about

using LineCollection.

Put all curves into line collection

Use Pick event to get line segment (what function to use ?)

Once I have line segment, get xdata, ydata corresponding to line segment (what function to use ?)

I tied this approach as well

Put all data points into numpy.array and each curve was separated by numpy.nan

It worked but I was getting run-time warning in distance calculations.

Any suggestions how to ?

Regards,

Arek

···

From: "matplotlib-users-request@lists.sourceforge.net" matplotlib-users-request@lists.sourceforge.net
To: matplotlib-users@lists.sourceforge.net
Sent: Saturday, May 12, 2012 1:12 PM
Subject: Matplotlib-users Digest, Vol 72, Issue 11

Send Matplotlib-users mailing list submissions to
matplotlib-users@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
or, via email, send a message with subject or body ‘help’ to
matplotlib-users-request@lists.sourceforge.net

You can reach the person managing the list at
matplotlib-users-owner@…431…ists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than “Re: Contents of Matplotlib-users digest…”

Today’s Topics:

  1. Re: Matplotlib-users Digest, Vol 72, Issue 10 (Arek Kedzior)
  2. Re: pick event (Arek Kedzior)

Message: 1
Date: Sat, 12 May 2012 09:35:59 -0700 (PDT)
From: Arek Kedzior <akedzior@…9…>
Subject: Re: [Matplotlib-users] Matplotlib-users Digest, Vol 72, Issue
10
To: "matplotlib-users@lists.sourceforge.net"
matplotlib-users@lists.sourceforge.net
Message-ID:
<1336840559.33998.YahooMailNeo@…4084…>
Content-Type: text/plain; charset=“iso-8859-1”

If you pick one of the curves in the close location to tangancy area, the OnPick function?will be?ececuted twice (2 curves) and will display 2 markers. I want to find the shortest distance from the pick location (mouse coord.) to a discrete point on the curve and?draw?marker on the curve at this location (only one).? See the line with “print lineObj”


From: “matplotlib-users-request@…1739…ge.net” matplotlib-users-request@lists.sourceforge.net
To: matplotlib-users@lists.sourceforge.net
Sent: Saturday, May 12, 2012 10:59 AM
Subject: Matplotlib-users Digest, Vol 72, Issue 10

Send Matplotlib-users mailing list submissions to
??? matplotlib-users@…1735…sourceforge.net

To subscribe or unsubscribe via the World Wide Web,
visit
??? https://lists.sourceforge.net/lists/listinfo/matplotlib-users
or, via email, send a message with subject or body ‘help’ to
??? matplotlib-users-request@lists.sourceforge.net

You can reach the person managing the list at
??? matplotlib-users-owner@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than “Re: Contents of Matplotlib-users digest…”

Today’s Topics:

? 1. pick event (Arek Kedzior)
? 2. Re: pick event (Jerzy Karczmarczuk)
? 3. Re: pick event (Benjamin
Root)


Message: 1
Date: Sat, 12 May 2012 06:07:37 -0700 (PDT)
From: Arek Kedzior <akedzior@…9…>
Subject: [Matplotlib-users] pick event
To: "matplotlib-users@lists.sourceforge.net"
??? matplotlib-users@lists.sourceforge.net
Message-ID:
??? <1336828057.20499.YahooMailNeo@…4083…>
Content-Type: text/plain; charset=“iso-8859-1”

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)
-------------- next part --------------
An HTML attachment was scrubbed…


Message: 2
Date: Sat, 12 May 2012 16:44:16 +0200
From: Jerzy Karczmarczuk <jerzy.karczmarczuk@…3937…>
Subject: Re: [Matplotlib-users] pick event
To: matplotlib-users@…1735…sourceforge.net
Message-ID: <4FAE7740.7070709@…3937…>
Content-Type: text/plain; charset=“iso-8859-1”

Arek Ke;dzior:

I am trying to use pick event.

What am I doing wrong ?
Wrong with WHAT?
What do you expect?

Jerzy Karczmarczuk

-------------- next part --------------
An HTML attachment was scrubbed…


Message: 3
Date: Sat, 12 May 2012 10:59:39 -0400
From: Benjamin Root <ben.root@…1304…>
Subject: Re: [Matplotlib-users] pick event
To: “jerzy.karczmarczuk@…3937…” <jerzy.karczmarczuk@…3937…>
Cc: “matplotlib-users@…504…et”
??? matplotlib-users@lists.sourceforge.net
Message-ID:
??? <CANNq6FnEP7Ugwvfj5FmVAyqsqyzhcc4bZg95J1Gzf_sq=2hK_g@…288…>
Content-Type: text/plain; charset=“utf-8”

On Saturday, May 12, 2012, Jerzy Karczmarczuk wrote:

? Arek K?dzior:

? I am trying to use pick event.

? What am I doing wrong ?

Wrong with WHAT?
What do you expect?

Jerzy Karczmarczuk

Arek.

Could you provide a little more detail about your issue?

Cheers!
Ben
Root
-------------- next part --------------
An HTML attachment was scrubbed…



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@…642…ts.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

End of Matplotlib-users Digest, Vol 72, Issue 10


-------------- next part --------------
An HTML attachment was scrubbed…


Message: 2
Date: Sat, 12 May 2012 10:12:18 -0700 (PDT)
From: Arek Kedzior <akedzior@…9…>
Subject: Re: [Matplotlib-users] pick event
To: "matplotlib-users@lists.sourceforge.net"
matplotlib-users@lists.sourceforge.net
Message-ID:
<1336842738.71819.YahooMailNeo@…83…4085…>
Content-Type: text/plain; charset=“iso-8859-1”

If you pick one of the curves in the close location to tangancy area, the OnPick function will be ececuted twice (2 curves) and will display 2 markers. I want to find the shortest distance from the pick location (mouse coord.) to a discrete point on the curve and draw marker on the curve at this location (only one). See the line with “print lineObj”


From: "matplotlib-users-request@lists.sourceforge.net" <matplotlib-users-request@…1064…t>
To: matplotlib-users@lists.sourceforge.net
Sent: Saturday, May 12, 2012 10:59 AM
Subject: Matplotlib-users Digest, Vol 72, Issue 10

Send Matplotlib-users mailing list submissions to
??? matplotlib-users@lists.sourceforge.net

To subscribe or unsubscribe via the World Wide Web, visit
??? https://lists.sourceforge.net/lists/listinfo/matplotlib-users
or, via email, send a message with subject or body ‘help’ to
??? matplotlib-users-request@lists.sourceforge.net

You can reach the person managing the list at
??? matplotlib-users-owner@lists.sourceforge.net

When replying, please edit your Subject line so it is more specific
than “Re: Contents of Matplotlib-users digest…”

Today’s Topics:

? 1. pick event (Arek Kedzior)
? 2. Re: pick event (Jerzy Karczmarczuk)
? 3. Re: pick event (Benjamin Root)


Message: 1
Date:
Sat, 12 May 2012 06:07:37 -0700 (PDT)
From: Arek Kedzior <akedzior@…1762…>
Subject: [Matplotlib-users] pick event
To: "matplotlib-users@lists.sourceforge.net"
??? <matplotlib-users@…813…ourceforge.net>
Message-ID:
??? <1336828057.20499.YahooMailNeo@…4083…>
Content-Type: text/plain; charset=“iso-8859-1”

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)
-------------- next part --------------
An HTML attachment was scrubbed…


Message: 2
Date: Sat, 12 May 2012 16:44:16 +0200
From: Jerzy Karczmarczuk <jerzy.karczmarczuk@…3937…>
Subject: Re: [Matplotlib-users] pick event
To: matplotlib-users@lists.sourceforge.net
Message-ID: <4FAE7740.7070709@…3937…>
Content-Type: text/plain; charset=“iso-8859-1”

Arek Ke;dzior:

I am trying to use pick
event.

What am I doing wrong ?
Wrong with WHAT?
What do you expect?

Jerzy Karczmarczuk

-------------- next part --------------
An HTML attachment was scrubbed…


Message: 3
Date: Sat, 12 May 2012 10:59:39 -0400
From: Benjamin Root <ben.root@…1304…>
Subject: Re: [Matplotlib-users] pick event
To: “jerzy.karczmarczuk@…3937…” <jerzy.karczmarczuk@…3937…>
Cc: “matplotlib-users@…431…ists.sourceforge.net”
??? matplotlib-users@lists.sourceforge.net
Message-ID:
??? <CANNq6FnEP7Ugwvfj5FmVAyqsqyzhcc4bZg95J1Gzf_sq=2hK_g@…288…>
Content-Type: text/plain; charset=“utf-8”

On Saturday, May 12, 2012, Jerzy Karczmarczuk wrote:

? Arek K?dzior:

? I am trying to use pick event.

? What am I doing wrong ?

Wrong with WHAT?
What do you expect?

Jerzy Karczmarczuk

Arek.

Could you provide a little more detail about your issue?

Cheers!
Ben Root
-------------- next part --------------
An HTML attachment was scrubbed…



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@…2569…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

End of Matplotlib-users Digest, Vol 72, Issue
10


-------------- next part --------------
An HTML attachment was scrubbed…



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

End of Matplotlib-users Digest, Vol 72, Issue 11


(13/05/2012 02:52), Arek Kędzior:

What I am trying is to plot multiple discontinuous lines.
I know that this approach does not work very well. How about
using LineCollection.
Put all curves into line collection
Use Pick event to get line segment (what function to use ?)
Once I have line segment, get xdata, ydata corresponding to line segment (what function to use ?)

Why don't you use:

picker=myTest

in your ax.plot, where

def myTest(artist,mousevnt):
...
return (hit,kwdict)

performs any test you like? Again, this is called separately for every Artist belonging to the Usual Suspects, but you may control whether this is the first line found, then your program just computes the distance, or the second one, then it computes the distance, and discriminates between the two. The properties kwdict passed to your callback will permit to do the rest.
Or, perhaps, the first time the test doesn't do anything, and returns False, and the second time computes both distances, and finds the minimum. You have your "private" access to both lines anyway. The generalization to many lines should be straightforward.

Jerzy K.