Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 99b5f0b

Browse filesBrowse files
committed
Simplify lasso_demo example.
- No need for a separate Datum data model, which feels a bit overengineered. - Showing how to directly use the collection's array to store the relevant info and colormapping for display purposes seems more interesting. This also allows directly using the return value of contains_point() to update the collection's array. - In general it is a good idea to not store a reference to the canvas (which can be swapped underneath you).
1 parent efd66d4 commit 99b5f0b
Copy full SHA for 99b5f0b

File tree

Expand file treeCollapse file tree

1 file changed

+25
-65
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+25
-65
lines changed

‎galleries/examples/event_handling/lasso_demo.py

Copy file name to clipboardExpand all lines: galleries/examples/event_handling/lasso_demo.py
+25-65Lines changed: 25 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
Lasso Demo
44
==========
55
6-
Show how to use a lasso to select a set of points and get the indices
7-
of the selected points. A callback is used to change the color of the
8-
selected points
9-
10-
This is currently a proof-of-concept implementation (though it is
11-
usable as is). There will be some refinement of the API.
6+
Use a lasso to select a set of points and get the indices of the selected points.
7+
A callback is used to change the color of the selected points.
128
139
.. note::
1410
This example exercises the interactive capabilities of Matplotlib, and this
@@ -28,79 +24,43 @@
2824
from matplotlib.widgets import Lasso
2925

3026

31-
class Datum:
32-
colorin = mcolors.to_rgba("red")
33-
colorout = mcolors.to_rgba("blue")
34-
35-
def __init__(self, x, y, include=False):
36-
self.x = x
37-
self.y = y
38-
if include:
39-
self.color = self.colorin
40-
else:
41-
self.color = self.colorout
42-
43-
4427
class LassoManager:
4528
def __init__(self, ax, data):
46-
self.axes = ax
47-
self.canvas = ax.figure.canvas
48-
self.data = data
49-
50-
self.Nxy = len(data)
51-
52-
facecolors = [d.color for d in data]
53-
self.xys = [(d.x, d.y) for d in data]
29+
# The information of whether a point has been selected or not is stored in the
30+
# collection's array (0 = out, 1 = in), which then gets colormapped to blue
31+
# (out) and red (in).
5432
self.collection = RegularPolyCollection(
55-
6, sizes=(100,),
56-
facecolors=facecolors,
57-
offsets=self.xys,
58-
offset_transform=ax.transData)
59-
33+
6, sizes=(100,), offset_transform=ax.transData,
34+
offsets=data, array=np.zeros(len(data)),
35+
clim=(0, 1), cmap=mcolors.ListedColormap(["tab:blue", "tab:red"]))
6036
ax.add_collection(self.collection)
61-
62-
self.cid_press = self.canvas.mpl_connect('button_press_event',
63-
self.on_press)
64-
self.cid_release = self.canvas.mpl_connect('button_release_event',
65-
self.on_release)
37+
canvas = ax.figure.canvas
38+
canvas.mpl_connect('button_press_event', self.on_press)
39+
canvas.mpl_connect('button_release_event', self.on_release)
6640

6741
def callback(self, verts):
68-
facecolors = self.collection.get_facecolors()
69-
p = path.Path(verts)
70-
ind = p.contains_points(self.xys)
71-
for i in range(len(self.xys)):
72-
if ind[i]:
73-
facecolors[i] = Datum.colorin
74-
else:
75-
facecolors[i] = Datum.colorout
76-
77-
self.canvas.draw_idle()
42+
data = self.collection.get_offsets()
43+
self.collection.set_array(path.Path(verts).contains_points(data))
44+
canvas = self.collection.figure.canvas
45+
canvas.draw_idle()
7846
del self.lasso
7947

8048
def on_press(self, event):
81-
if self.canvas.widgetlock.locked():
49+
canvas = self.collection.figure.canvas
50+
if event.inaxes is not self.collection.axes or canvas.widgetlock.locked():
8251
return
83-
if event.inaxes is None:
84-
return
85-
self.lasso = Lasso(event.inaxes,
86-
(event.xdata, event.ydata),
87-
self.callback)
88-
# acquire a lock on the widget drawing
89-
self.canvas.widgetlock(self.lasso)
52+
self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata), self.callback)
53+
canvas.widgetlock(self.lasso) # acquire a lock on the widget drawing
9054

9155
def on_release(self, event):
92-
if hasattr(self, 'lasso') and self.canvas.widgetlock.isowner(self.lasso):
93-
self.canvas.widgetlock.release(self.lasso)
56+
canvas = self.collection.figure.canvas
57+
if hasattr(self, 'lasso') and canvas.widgetlock.isowner(self.lasso):
58+
canvas.widgetlock.release(self.lasso)
9459

9560

9661
if __name__ == '__main__':
97-
9862
np.random.seed(19680801)
99-
100-
data = [Datum(*xy) for xy in np.random.rand(100, 2)]
101-
ax = plt.axes(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
102-
ax.set_title('Lasso points using left mouse button')
103-
104-
lman = LassoManager(ax, data)
105-
63+
ax = plt.figure().add_subplot(
64+
xlim=(0, 1), ylim=(0, 1), title='Lasso points using left mouse button')
65+
manager = LassoManager(ax, np.random.rand(100, 2))
10666
plt.show()

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.