Re: [Matplotlib-users] Updated Lasso Demo

2008-12-11 Thread Eric Bruning
+1 for including Brian's changes in the shipping example.

Brian, You might also be interested in an alternate, polygon-based
lasso I developed a while back. Though it meets my needs, beware of
backend-specific problems with idle events that I never resolved.

-Eric

http://www.nabble.com/Alternate-lasso:-click-to-form-polygon-td18724261.html

On Sun, Dec 7, 2008 at 10:24 AM, B Clowers  wrote:
> When running the initial lasso demo I found that only one lasso event was
> allowed and other canvas interaction events (e.g. zooming) would not work
> properly after the lasso event.  As such I came up with my own solution to
> the problem by modifying the example source.  The primary addition was a
> button release event call and a boolean to keep track whether the lasso was
> the last event to lock the widget from interaction.  Anyway, I hope it can
> help someone else out.
>
> Cheers,
>
> Brian
>
> 
> """
> Show how to use a lasso to select a set of points and get the indices
> of the selected points.  A callback is used to change the color of the
> selected points
>
> This is currently a proof-of-concept implementation (though it is
> usable as is).  There will be some refinement of the API and the
> inside polygon detection routine.
> """
> from matplotlib.widgets import Lasso
> import matplotlib.mlab
> from matplotlib.nxutils import points_inside_poly
> from matplotlib.colors import colorConverter
> from matplotlib.collections import RegularPolyCollection
>
> from matplotlib.pyplot import figure, show
> from numpy import nonzero
> from numpy.random import rand
>
> class Datum:
> colorin = colorConverter.to_rgba('red')
> colorout = colorConverter.to_rgba('green')
> def __init__(self, x, y, include=False):
> self.x = x
> self.y = y
> if include: self.color = self.colorin
> else: self.color = self.colorout
>
>
> class LassoManager:
> def __init__(self, ax, data):
> self.axes = ax
> self.canvas = ax.figure.canvas
> self.data = data
> #the lasso lock boolean is used to tell whether another
> #widget event has priority
> self.lassoLock = False
>
> self.Nxy = len(data)
>
> facecolors = [d.color for d in data]
> self.xys = [(d.x, d.y) for d in data]
> fig = ax.figure
> self.collection = RegularPolyCollection(
> fig.dpi, 6, sizes=(100,),
> facecolors=facecolors,
> offsets = self.xys,
> transOffset = ax.transData)
>
> ax.add_collection(self.collection)
>
> self.cid = self.canvas.mpl_connect('button_press_event',
> self.onpress)
> self.cidRelease = self.canvas.mpl_connect('button_release_event',
> self.onrelease)
>
> self.ind = None
>
> def callback(self, verts):
> facecolors = self.collection.get_facecolors()
> ind = nonzero(points_inside_poly(self.xys, verts))[0]
> for i in range(self.Nxy):
> if i in ind:
> facecolors[i] = Datum.colorin
> else:
> facecolors[i] = Datum.colorout
>
> self.canvas.draw_idle()
> self.canvas.widgetlock.release(self.lasso)
> #del self.lasso
> self.ind = ind
>
> def onpress(self, event):
> if self.canvas.widgetlock.locked(): return
> if event.inaxes is None: return
> self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata),
> self.callback)
> # acquire a lock on the widget drawing
> self.canvas.widgetlock(self.lasso)
> # establish boolean that can be used to release the widgetlock
> self.lassoLock = True
>
> def onrelease(self, event):
> 'on release we reset the press data'
> # test whether the widgetlock was initiated by the lasso
> if self.lassoLock:
> self.canvas.widgetlock.release(self.lasso)
> self.lassoLock = False
> print self.ind
>
>
> if __name__ == '__main__':
>
> data = [Datum(*xy) for xy in rand(100, 2)]
>
> fig = figure()
> ax = fig.add_subplot(111, xlim=(0,1), ylim=(0,1), autoscale_on=False)
> lman = LassoManager(ax, data)
>
> show()
>
>
> --
> SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
> The future of the web can't happen without you.  Join us at MIX09 to help
> pave the way to the Next Web now. Learn more and register at
> http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
> ___
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>

--
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't ha

[Matplotlib-users] Updated Lasso Demo

2008-12-07 Thread B Clowers
When running the initial lasso demo I found that only one lasso event was 
allowed and other canvas interaction events (e.g. zooming) would not work 
properly after the lasso event.  As such I came up with my own solution to the 
problem by modifying the example source.  The primary addition was a button 
release event call and a boolean to keep track whether the lasso was the last 
event to lock the widget from interaction.  Anyway, I hope it can help someone 
else out.

Cheers,

Brian


"""
Show how to use a lasso to select a set of points and get the indices
of the selected points.  A callback is used to change the color of the
selected points

This is currently a proof-of-concept implementation (though it is
usable as is).  There will be some refinement of the API and the
inside polygon detection routine.
"""
from matplotlib.widgets import Lasso
import matplotlib.mlab
from matplotlib.nxutils import points_inside_poly
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection

from matplotlib.pyplot import figure, show
from numpy import nonzero
from numpy.random import rand

class Datum:
    colorin = colorConverter.to_rgba('red')
    colorout = colorConverter.to_rgba('green')
    def __init__(self, x, y, include=False):
    self.x = x
    self.y = y
    if include: self.color = self.colorin
    else: self.color = self.colorout


class LassoManager:
    def __init__(self, ax, data):
    self.axes = ax
    self.canvas = ax.figure.canvas
    self.data = data
    #the lasso lock boolean is used to tell whether another
    #widget event has priority
    self.lassoLock = False

    self.Nxy = len(data)

    facecolors = [d.color for d in data]
    self.xys = [(d.x, d.y) for d in data]
    fig = ax.figure
    self.collection = RegularPolyCollection(
    fig.dpi, 6, sizes=(100,),
    facecolors=facecolors,
    offsets = self.xys,
    transOffset = ax.transData)

    ax.add_collection(self.collection)

    self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)
    self.cidRelease = self.canvas.mpl_connect('button_release_event', 
self.onrelease)

    self.ind = None

    def callback(self, verts):
    facecolors = self.collection.get_facecolors()
    ind = nonzero(points_inside_poly(self.xys, verts))[0]
    for i in range(self.Nxy):
    if i in ind:
    facecolors[i] = Datum.colorin
    else:
    facecolors[i] = Datum.colorout

    self.canvas.draw_idle()
    self.canvas.widgetlock.release(self.lasso)
    #del self.lasso
    self.ind = ind

    def onpress(self, event):
    if self.canvas.widgetlock.locked(): return
    if event.inaxes is None: return
    self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata), 
self.callback)
    # acquire a lock on the widget drawing
    self.canvas.widgetlock(self.lasso)
    # establish boolean that can be used to release the widgetlock
    self.lassoLock = True

    def onrelease(self, event):
    'on release we reset the press data'
    # test whether the widgetlock was initiated by the lasso
    if self.lassoLock:
    self.canvas.widgetlock.release(self.lasso)
    self.lassoLock = False
    print self.ind


if __name__ == '__main__':

    data = [Datum(*xy) for xy in rand(100, 2)]

    fig = figure()
    ax = fig.add_subplot(111, xlim=(0,1), ylim=(0,1), autoscale_on=False)
    lman = LassoManager(ax, data)

    show()



  """
Show how to use a lasso to select a set of points and get the indices
of the selected points.  A callback is used to change the color of the
selected points

This is currently a proof-of-concept implementation (though it is
usable as is).  There will be some refinement of the API and the
inside polygon detection routine.
"""
from matplotlib.widgets import Lasso
import matplotlib.mlab
from matplotlib.nxutils import points_inside_poly
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection

from matplotlib.pyplot import figure, show
from numpy import nonzero
from numpy.random import rand

class Datum:
colorin = colorConverter.to_rgba('red')
colorout = colorConverter.to_rgba('green')
def __init__(self, x, y, include=False):
self.x = x
self.y = y
if include: self.color = self.colorin
else: self.color = self.colorout


class LassoManager:
def __init__(self, ax, data):
self.axes = ax
self.canvas = ax.figure.canvas
self.data = data
#the lasso lock boolean is used to tell whether another
#widget event has priority
self.lassoLock = False

self.Nxy = len(data)

facecolors = [d.color for d in data]
self.xys = [(d.x, d.y) for d in data]
fig = ax.figure