Selecionar Índices Usando o Polygon Selector

Beginner

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

Introdução

Este laboratório demonstra como usar a ferramenta Polygon Selector no Matplotlib para selecionar índices de uma coleção. A ferramenta Polygon Selector permite ao usuário selecionar pontos em um gráfico desenhando um polígono ao redor deles. Os pontos selecionados são então destacados, enquanto os pontos não selecionados são atenuados. Os índices dos pontos selecionados são salvos em um array, que pode então ser usado para análise posterior.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar Bibliotecas

Nesta etapa, importaremos as bibliotecas necessárias para este laboratório. Usaremos numpy e matplotlib para manipulação e visualização de dados.

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

Criar Dados

Nesta etapa, criaremos alguns dados para visualizar. Criaremos um gráfico de dispersão (scatter plot) de pontos em uma grade.

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 Classe Seletora

Nesta etapa, definiremos uma classe que nos permitirá selecionar pontos do gráfico de dispersão usando a ferramenta Polygon Selector. Esta classe salvará os índices dos pontos selecionados em um array.

class SelectFromCollection:
    """
    Seleciona índices de uma coleção matplotlib usando `PolygonSelector`.

    Os índices selecionados são salvos no atributo `ind`. Esta ferramenta atenua os
    pontos que não fazem parte da seleção (ou seja, reduz seus valores alfa). Se sua
    coleção tiver alfa < 1, esta ferramenta alterará permanentemente os valores alfa.

    Observe que esta ferramenta seleciona objetos de coleção com base em suas *origens*
    (ou seja, `offsets`).

    Parâmetros
    ----------
    ax : `~matplotlib.axes.Axes`
        Eixos para interagir.
    collection : subclasse `matplotlib.collections.Collection`
        Coleção da qual você deseja selecionar.
    alpha_other : 0 <= float <= 1
        Para destacar uma seleção, esta ferramenta define todos os pontos selecionados para um
        valor alfa de 1 e pontos não selecionados para *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()

Criar Objeto Seletor

Nesta etapa, criaremos uma instância da classe Selector que definimos na Etapa 3. Isso nos permitirá selecionar pontos do gráfico de dispersão usando a ferramenta Polygon Selector.

selector = SelectFromCollection(ax, pts)

Selecionar Pontos

Nesta etapa, selecionaremos pontos do gráfico de dispersão usando a ferramenta Polygon Selector. Podemos selecionar pontos desenhando um polígono ao redor deles. Os pontos selecionados serão destacados, enquanto os pontos não selecionados serão atenuados.

print("Selecione os pontos na figura, incluindo-os dentro de um polígono.")
print("Pressione a tecla 'esc' para iniciar um novo polígono.")
print("Tente segurar a tecla 'shift' para mover todos os vértices.")
print("Tente segurar a tecla 'ctrl' para mover um único vértice.")
plt.show()

Desconectar Objeto Seletor

Nesta etapa, desconectaremos o objeto Selector para liberar os recursos usados pela ferramenta Polygon Selector.

selector.disconnect()

Imprimir Pontos Selecionados

Nesta etapa, imprimiremos as coordenadas dos pontos selecionados.

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

Resumo

Este laboratório demonstra como usar a ferramenta Polygon Selector no Matplotlib para selecionar índices de um gráfico de dispersão (scatter plot). A classe Selector permite que o usuário selecione pontos desenhando um polígono ao redor deles. Os pontos selecionados são destacados, enquanto os pontos não selecionados são atenuados. Os índices dos pontos selecionados são salvos em um array, que pode ser usado para análise posterior.