Skip to content

Fix lasso example. #732

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 11 additions & 14 deletions examples/event_handling/lasso_demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,28 @@
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.
usable as is). There will be some refinement of the API.
"""
from matplotlib.widgets import Lasso
from matplotlib.nxutils import points_inside_poly
from matplotlib.path import Path
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection

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

class Datum:
class Datum(object):
colorin = colorConverter.to_rgba('red')
colorout = colorConverter.to_rgba('green')
colorout = colorConverter.to_rgba('blue')
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:
class LassoManager(object):
def __init__(self, ax, data):
self.axes = ax
self.canvas = ax.figure.canvas
Expand All @@ -46,21 +45,20 @@ def __init__(self, ax, data):
ax.add_collection(self.collection)

self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)
self.ind = None

def callback(self, verts):
facecolors = self.collection.get_facecolors()
ind = nonzero(points_inside_poly(self.xys, verts))[0]
p = Path(verts)
for i in range(self.Nxy):
if i in ind:
if p.contains_point(self.xys[i]):
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
Expand All @@ -72,8 +70,7 @@ def onpress(self, event):

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)
ax = plt.axes(xlim=(0,1), ylim=(0,1), autoscale_on=False)
lman = LassoManager(ax, data)

show()
plt.show()