Seleccionar índices utilizando el Selector de polígonos

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo utilizar la herramienta Selector de polígonos en Matplotlib para seleccionar índices de una colección. La herramienta Selector de polígonos permite al usuario seleccionar puntos en un gráfico dibujando un polígono alrededor de ellos. Los puntos seleccionados se resaltan mientras que los no seleccionados se desvanecen. Los índices de los puntos seleccionados se guardan en una matriz, que luego se puede utilizar para análisis adicionales.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar bibliotecas

En este paso, importaremos las bibliotecas necesarias para esta práctica. Utilizaremos numpy y matplotlib para la manipulación y visualización de datos.

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

Crear datos

En este paso, crearemos algunos datos para visualizar. Crearemos un diagrama de dispersión de puntos en una cuadrícula.

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)

Definir la clase Selector

En este paso, definiremos una clase que nos permitirá seleccionar puntos del diagrama de dispersión utilizando la herramienta Selector de polígonos. Esta clase guardará los índices de los puntos seleccionados en una matriz.

class SelectFromCollection:
    """
    Selecciona índices de una colección de matplotlib usando `PolygonSelector`.

    Los índices seleccionados se guardan en el atributo `ind`. Esta herramienta desvanece los
    puntos que no forman parte de la selección (es decir, reduce sus valores de alfa).
    Si su colección tiene un alfa < 1, esta herramienta cambiará permanentemente
    los valores de alfa.

    Tenga en cuenta que esta herramienta selecciona objetos de colección basados en sus *orígenes*
    (es decir, `offsets`).

    Parámetros
    ----------
    ax : `~matplotlib.axes.Axes`
        Ejes con los que interactuar.
    collection : `matplotlib.collections.Collection` subclase
        Colección de la que desea seleccionar.
    alpha_other : 0 <= float <= 1
        Para resaltar una selección, esta herramienta establece todos los puntos seleccionados
        a un valor de alfa de 1 y los puntos no seleccionados a *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)

        ## Asegurarse de que tenemos colores separados para cada objeto
        self.fc = collection.get_facecolors()
        if len(self.fc) == 0:
            raise ValueError('La colección debe tener un color de cara')
        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()

Crear objeto Selector

En este paso, crearemos una instancia de la clase Selector que definimos en el Paso 3. Esto nos permitirá seleccionar puntos del diagrama de dispersión utilizando la herramienta Selector de polígonos.

selector = SelectFromCollection(ax, pts)

Seleccionar puntos

En este paso, seleccionaremos puntos del diagrama de dispersión utilizando la herramienta Selector de polígonos. Podemos seleccionar puntos dibujando un polígono alrededor de ellos. Los puntos seleccionados se resaltarán mientras que los puntos no seleccionados se desvanecerán.

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

Desconectar el objeto Selector

En este paso, desconectaremos el objeto Selector para liberar los recursos utilizados por la herramienta Selector de polígonos.

selector.disconnect()

Imprimir los puntos seleccionados

En este paso, imprimiremos las coordenadas de los puntos seleccionados.

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

Resumen

Esta práctica demuestra cómo utilizar la herramienta Selector de polígonos en Matplotlib para seleccionar índices a partir de un diagrama de dispersión. La clase Selector permite al usuario seleccionar puntos dibujando un polígono alrededor de ellos. Los puntos seleccionados se resaltan mientras que los puntos no seleccionados se desvanecen. Los índices de los puntos seleccionados se guardan en una matriz, que se puede utilizar para un análisis ulterior.