from matplotlib import colors as mcolors, path from matplotlib.collections import RegularPolyCollection import matplotlib.pyplot as plt from matplotlib.widgets import Lasso import numpy as np
facecolors = [d.color for d in data] self.xys = [(d.x, d.y) for d in data] self.collection = RegularPolyCollection( 6, sizes=(100,), facecolors=facecolors, offsets=self.xys, transOffset=ax.transData)
defcallback(self, verts): facecolors = self.collection.get_facecolors() p = path.Path(verts) ind = p.contains_points(self.xys) for i inrange(len(self.xys)): if ind[i]: facecolors[i] = Datum.colorin else: facecolors[i] = Datum.colorout
defonpress(self, event): ifself.canvas.widgetlock.locked(): return if event.inaxes isNone: return self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata), self.callback) # acquire a lock on the widget drawing self.canvas.widgetlock(self.lasso)
if __name__ == '__main__':
np.random.seed(19680801)
data = [Datum(*xy) for xy in np.random.rand(100, 2)] ax = plt.axes(xlim=(0, 1), ylim=(0, 1), autoscale_on=False) ax.set_title('Lasso points using left mouse button')