Select Indices Using Polygon Selector

PythonPythonBeginner
Practice Now

This tutorial is from open-source community. Access the source code

Introduction

This lab demonstrates how to use the Polygon Selector tool in Matplotlib to select indices from a collection. The Polygon Selector tool allows the user to select points on a graph by drawing a polygon around them. The selected points are then highlighted while the unselected points are faded out. The indices of the selected points are saved in an array, which can then be used for further analysis.

VM Tips

After the VM startup is done, click the top left corner to switch to the Notebook tab to access Jupyter Notebook for practice.

Sometimes, you may need to wait a few seconds for Jupyter Notebook to finish loading. The validation of operations cannot be automated because of limitations in Jupyter Notebook.

If you face issues during learning, feel free to ask Labby. Provide feedback after the session, and we will promptly resolve the problem for you.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("`Python`")) -.-> python/BasicConceptsGroup(["`Basic Concepts`"]) python(("`Python`")) -.-> python/FileHandlingGroup(["`File Handling`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/BasicConceptsGroup(["`Basic Concepts`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/PlottingDataGroup(["`Plotting Data`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/InteractiveFeaturesGroup(["`Interactive Features`"]) matplotlib(("`Matplotlib`")) -.-> matplotlib/AdvancedTopicsGroup(["`Advanced Topics`"]) python(("`Python`")) -.-> python/ControlFlowGroup(["`Control Flow`"]) python(("`Python`")) -.-> python/DataStructuresGroup(["`Data Structures`"]) python(("`Python`")) -.-> python/FunctionsGroup(["`Functions`"]) python(("`Python`")) -.-> python/ModulesandPackagesGroup(["`Modules and Packages`"]) python(("`Python`")) -.-> python/ObjectOrientedProgrammingGroup(["`Object-Oriented Programming`"]) python(("`Python`")) -.-> python/ErrorandExceptionHandlingGroup(["`Error and Exception Handling`"]) python(("`Python`")) -.-> python/DataScienceandMachineLearningGroup(["`Data Science and Machine Learning`"]) python/BasicConceptsGroup -.-> python/comments("`Comments`") python/FileHandlingGroup -.-> python/with_statement("`Using with Statement`") matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("`Importing Matplotlib`") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("`Understanding Figures and Axes`") matplotlib/PlottingDataGroup -.-> matplotlib/scatter_plots("`Scatter Plots`") matplotlib/InteractiveFeaturesGroup -.-> matplotlib/interactive_backends("`Interactive Backends`") matplotlib/InteractiveFeaturesGroup -.-> matplotlib/widgets_sliders("`Widgets and Sliders`") matplotlib/AdvancedTopicsGroup -.-> matplotlib/event_handling("`Event Handling`") python/BasicConceptsGroup -.-> python/variables_data_types("`Variables and Data Types`") python/BasicConceptsGroup -.-> python/numeric_types("`Numeric Types`") python/BasicConceptsGroup -.-> python/booleans("`Booleans`") python/ControlFlowGroup -.-> python/conditional_statements("`Conditional Statements`") python/ControlFlowGroup -.-> python/for_loops("`For Loops`") python/DataStructuresGroup -.-> python/lists("`Lists`") python/DataStructuresGroup -.-> python/tuples("`Tuples`") python/FunctionsGroup -.-> python/function_definition("`Function Definition`") python/FunctionsGroup -.-> python/default_arguments("`Default Arguments`") python/ModulesandPackagesGroup -.-> python/importing_modules("`Importing Modules`") python/ModulesandPackagesGroup -.-> python/using_packages("`Using Packages`") python/ModulesandPackagesGroup -.-> python/standard_libraries("`Common Standard Libraries`") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("`Classes and Objects`") python/ObjectOrientedProgrammingGroup -.-> python/constructor("`Constructor`") python/ObjectOrientedProgrammingGroup -.-> python/polymorphism("`Polymorphism`") python/ObjectOrientedProgrammingGroup -.-> python/encapsulation("`Encapsulation`") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("`Raising Exceptions`") python/DataScienceandMachineLearningGroup -.-> python/numerical_computing("`Numerical Computing`") python/DataScienceandMachineLearningGroup -.-> python/data_visualization("`Data Visualization`") python/FunctionsGroup -.-> python/build_in_functions("`Build-in Functions`") subgraph Lab Skills python/comments -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/with_statement -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} matplotlib/importing_matplotlib -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} matplotlib/figures_axes -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} matplotlib/scatter_plots -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} matplotlib/interactive_backends -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} matplotlib/widgets_sliders -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} matplotlib/event_handling -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/variables_data_types -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/numeric_types -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/booleans -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/conditional_statements -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/for_loops -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/lists -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/tuples -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/function_definition -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/default_arguments -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/importing_modules -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/using_packages -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/standard_libraries -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/classes_objects -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/constructor -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/polymorphism -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/encapsulation -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/raising_exceptions -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/numerical_computing -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/data_visualization -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} python/build_in_functions -.-> lab-48877{{"`Select Indices Using Polygon Selector`"}} end

Import Libraries

In this step, we will import the necessary libraries for this lab. We will be using numpy and matplotlib for data manipulation and visualization.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.widgets import PolygonSelector

Create Data

In this step, we will create some data to visualize. We will create a scatter plot of points on a grid.

fig, ax = plt.subplots()
grid_size = 5
grid_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)

Define Selector Class

In this step, we will define a class that will allow us to select points from the scatter plot using the Polygon Selector tool. This class will save the indices of the selected points in an array.

class SelectFromCollection:
    """
    Select indices from a matplotlib collection using `PolygonSelector`.

    Selected indices are saved in the `ind` attribute. This tool fades out the
    points that are not part of the selection (i.e., reduces their alpha
    values). If your collection has alpha < 1, this tool will permanently
    alter the alpha values.

    Note that this tool selects collection objects based on their *origins*
    (i.e., `offsets`).

    Parameters
    ----------
    ax : `~matplotlib.axes.Axes`
        Axes to interact with.
    collection : `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, 1))

        self.poly = PolygonSelector(ax, self.onselect, draw_bounding_box=True)
        self.ind = []

    def onselect(self, verts):
        path = Path(verts)
        self.ind = np.nonzero(path.contains_points(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.poly.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

Create Selector Object

In this step, we will create an instance of the Selector class that we defined in Step 3. This will allow us to select points from the scatter plot using the Polygon Selector tool.

selector = SelectFromCollection(ax, pts)

Select Points

In this step, we will select points from the scatter plot using the Polygon Selector tool. We can select points by drawing a polygon around them. The selected points will be highlighted while the unselected points will be faded out.

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()

Disconnect Selector Object

In this step, we will disconnect the Selector object to release the resources used by the Polygon Selector tool.

selector.disconnect()

Print Selected Points

In this step, we will print the coordinates of the selected points.

print('\nSelected points:')
print(selector.xys[selector.ind])

Summary

This lab demonstrates how to use the Polygon Selector tool in Matplotlib to select indices from a scatter plot. The Selector class allows the user to select points by drawing a polygon around them. The selected points are highlighted while the unselected points are faded out. The indices of the selected points are saved in an array, which can be used for further analysis.

Other Python Tutorials you may like