.. _widgets-lasso_selector_demo:

widgets example code: lasso_selector_demo.py
============================================

[`source code <lasso_selector_demo.py>`_]

::

    from __future__ import print_function
    
    from six.moves import input
    
    import numpy as np
    
    from matplotlib.widgets import LassoSelector
    from matplotlib.path import Path
    
    
    class SelectFromCollection(object):
        """Select indices from a matplotlib collection using `LassoSelector`.
    
        Selected indices are saved in the `ind` attribute. This tool highlights
        selected points by fading them out (i.e., reducing their alpha values).
        If your collection has alpha < 1, this tool will permanently alter them.
    
        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` subclass
            Collection you want to select from.
    
        alpha_other : 0 <= float <= 1
            To highlight a selection, this tool sets all selected points to an
            alpha value of 1 and non-selected points to `alpha_other`.
        """
    
        def __init__(self, ax, collection, alpha_other=0.3):
            self.canvas = ax.figure.canvas
            self.collection = collection
            self.alpha_other = alpha_other
    
            self.xys = collection.get_offsets()
            self.Npts = len(self.xys)
    
            # Ensure that we have separate colors for each object
            self.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).reshape(self.Npts, -1)
    
            self.lasso = LassoSelector(ax, onselect=self.onselect)
            self.ind = []
    
        def onselect(self, verts):
            path = Path(verts)
            self.ind = np.nonzero([path.contains_point(xy) for xy in self.xys])[0]
            self.fc[:, -1] = self.alpha_other
            self.fc[self.ind, -1] = 1
            self.collection.set_facecolors(self.fc)
            self.canvas.draw_idle()
    
        def disconnect(self):
            self.lasso.disconnect_events()
            self.fc[:, -1] = 1
            self.collection.set_facecolors(self.fc)
            self.canvas.draw_idle()
    
    
    if __name__ == '__main__':
        import matplotlib.pyplot as plt
    
        plt.ion()
        data = np.random.rand(100, 2)
    
        subplot_kw = dict(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
        fig, ax = plt.subplots(subplot_kw=subplot_kw)
    
        pts = ax.scatter(data[:, 0], data[:, 1], s=80)
        selector = SelectFromCollection(ax, pts)
    
        plt.draw()
        input('Press Enter to accept selected points')
        print("Selected points:")
        print(selector.xys[selector.ind])
        selector.disconnect()
    
        # Block end of script so you can check that the lasso is disconnected.
        input('Press Enter to quit')
    

Keywords: python, matplotlib, pylab, example, codex (see :ref:`how-to-search-examples`)