多边形选择器演示
显示如何以交互方式选择多边形的索引。

输出:
Select points in the figure by enclosing them within a polygon.Press the 'esc' key to start a new polygon.Try holding the 'shift' key to move all of the vertices.Try holding the 'ctrl' key to move a single vertex.Selected points:[]
import numpy as npfrom matplotlib.widgets import PolygonSelectorfrom matplotlib.path import Pathclass SelectFromCollection(object):"""Select indices from a matplotlib collection using `PolygonSelector`.Selected indices are saved in the `ind` attribute. This tool fades out thepoints that are not part of the selection (i.e., reduces their alphavalues). If your collection has alpha < 1, this tool will permanentlyalter the alpha values.Note that this tool selects collection objects based on their *origins*(i.e., `offsets`).Parameters----------ax : :class:`~matplotlib.axes.Axes`Axes to interact with.collection : :class:`matplotlib.collections.Collection` subclassCollection you want to select from.alpha_other : 0 <= float <= 1To highlight a selection, this tool sets all selected points to analpha value of 1 and non-selected points to `alpha_other`."""def __init__(self, ax, collection, alpha_other=0.3):self.canvas = ax.figure.canvasself.collection = collectionself.alpha_other = alpha_otherself.xys = collection.get_offsets()self.Npts = len(self.xys)# Ensure that we have separate colors for each objectself.fc = collection.get_facecolors()if len(self.fc) == 0:raise ValueError('Collection must have a facecolor')elif len(self.fc) == 1:self.fc = np.tile(self.fc, (self.Npts, 1))self.poly = PolygonSelector(ax, self.onselect)self.ind = []def onselect(self, verts):path = Path(verts)self.ind = np.nonzero(path.contains_points(self.xys))[0]self.fc[:, -1] = self.alpha_otherself.fc[self.ind, -1] = 1self.collection.set_facecolors(self.fc)self.canvas.draw_idle()def disconnect(self):self.poly.disconnect_events()self.fc[:, -1] = 1self.collection.set_facecolors(self.fc)self.canvas.draw_idle()if __name__ == '__main__':import matplotlib.pyplot as pltfig, ax = plt.subplots()grid_size = 5grid_x = np.tile(np.arange(grid_size), grid_size)grid_y = np.repeat(np.arange(grid_size), grid_size)pts = ax.scatter(grid_x, grid_y)selector = SelectFromCollection(ax, pts)print("Select points in the figure by enclosing them within a polygon.")print("Press the 'esc' key to start a new polygon.")print("Try holding the 'shift' key to move all of the vertices.")print("Try holding the 'ctrl' key to move a single vertex.")plt.show()selector.disconnect()# After figure is closed print the coordinates of the selected pointsprint('\nSelected points:')print(selector.xys[selector.ind])
