Desenhando Formas com Widgets do Matplotlib

Beginner

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

Introdução

Neste laboratório, aprenderemos como usar os widgets RectangleSelector e EllipseSelector em Matplotlib para desenhar um retângulo ou elipse da posição inicial do clique até a posição atual do mouse.

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 às limitações do 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 as bibliotecas necessárias

Começaremos importando as bibliotecas necessárias: Matplotlib, Numpy e os widgets RectangleSelector e EllipseSelector.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import EllipseSelector, RectangleSelector

Definir a função de retorno de chamada (callback) de seleção

A função de retorno de chamada (callback) de seleção será chamada toda vez que o usuário selecionar um retângulo ou elipse. A função receberá os eventos de clique e liberação como argumentos e imprimirá as coordenadas do retângulo ou elipse.

def select_callback(eclick, erelease):
    """
    Função de retorno de chamada para seleção de linha.

    *eclick* e *erelease* são os eventos de pressionar e soltar.
    """
    x1, y1 = eclick.xdata, eclick.ydata
    x2, y2 = erelease.xdata, erelease.ydata
    print(f"({x1:3.2f}, {y1:3.2f}) --> ({x2:3.2f}, {y2:3.2f})")
    print(f"The buttons you used were: {eclick.button} {erelease.button}")

Definir a função de alternância do seletor

A função de alternância do seletor será chamada toda vez que o usuário pressionar a tecla 't'. Esta função irá alternar o status ativo dos widgets RectangleSelector e EllipseSelector.

def toggle_selector(event):
    print('Key pressed.')
    if event.key == 't':
        for selector in selectors:
            name = type(selector).__name__
            if selector.active:
                print(f'{name} deactivated.')
                selector.set_active(False)
            else:
                print(f'{name} activated.')
                selector.set_active(True)

Criar a figura e os subplots

Criaremos uma figura com dois subplots, um para o RectangleSelector e outro para o EllipseSelector.

fig = plt.figure(layout='constrained')
axs = fig.subplots(2)

Plotar algo nos subplots

Plotaremos algo nos subplots, para que o usuário possa ver o efeito do RectangleSelector e do EllipseSelector.

N = 100000  ## If N is large one can see improvement by using blitting.
x = np.linspace(0, 10, N)

for ax in axs:
    ax.plot(x, np.sin(2*np.pi*x))  ## plot something

Criar os widgets RectangleSelector e EllipseSelector

Criaremos os widgets RectangleSelector e EllipseSelector e os adicionaremos aos subplots.

selectors = []
for ax, selector_class in zip(axs, [RectangleSelector, EllipseSelector]):
    ax.set_title(f"Click and drag to draw a {selector_class.__name__}.")
    selectors.append(selector_class(
        ax, select_callback,
        useblit=True,
        button=[1, 3],  ## disable middle button
        minspanx=5, minspany=5,
        spancoords='pixels',
        interactive=True))
    fig.canvas.mpl_connect('key_press_event', toggle_selector)
axs[0].set_title("Press 't' to toggle the selectors on and off.\n"
                 + axs[0].get_title())

Mostrar o gráfico

Finalmente, mostraremos o gráfico ao usuário.

plt.show()

Resumo

Neste laboratório, aprendemos como usar os widgets RectangleSelector e EllipseSelector em Matplotlib para desenhar um retângulo ou elipse da posição inicial do clique até a posição atual do mouse. Também aprendemos como criar uma figura com subplots, plotar algo nos subplots e alternar o status ativo dos widgets usando um evento de pressionamento de tecla.