Introdução
Este laboratório irá guiá-lo através da criação de um efeito de espelho mágico (looking glass effect) usando eventos de mouse em Matplotlib. Este exemplo permitirá que você inspecione dados em uma área circular que pode ser movida ao redor clicando e arrastando.
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ê.
Importando as Bibliotecas Necessárias
Precisamos importar a biblioteca Matplotlib, a biblioteca NumPy e o módulo patches do Matplotlib. Usaremos essas bibliotecas para criar nosso efeito de espelho mágico (looking glass effect).
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches
Gerando os Dados Aleatórios
Geraremos dois conjuntos de dados aleatórios usando NumPy. Esses dados serão plotados para criar um gráfico de dispersão (scatterplot).
## Fixing random state for reproducibility
np.random.seed(19680801)
x, y = np.random.rand(2, 200)
Criando a Figura e os Eixos
Criaremos o objeto figura e eixos usando a função subplots(). Também adicionaremos um patch de círculo amarelo ao objeto eixos usando a função patches.Circle().
fig, ax = plt.subplots()
circ = patches.Circle((0.5, 0.5), 0.25, alpha=0.8, fc='yellow')
ax.add_patch(circ)
Plotando os Dados
Plotaremos os dados aleatórios gerados no Passo 2 usando a função plot() duas vezes. O primeiro gráfico terá um valor alpha de 0.2 e o segundo gráfico terá um valor alpha de 1.0 e um caminho de recorte (clip path) definido para o patch de círculo amarelo.
ax.plot(x, y, alpha=0.2)
line, = ax.plot(x, y, alpha=1.0, clip_path=circ)
ax.set_title("Left click and drag to move looking glass")
Criando o Manipulador de Eventos
Criaremos uma classe manipuladora de eventos que lidará com os eventos do mouse necessários para mover o patch de círculo amarelo ao redor do gráfico. Esta classe conterá três métodos: on_press(), on_release() e on_move().
class EventHandler:
def __init__(self):
fig.canvas.mpl_connect('button_press_event', self.on_press)
fig.canvas.mpl_connect('button_release_event', self.on_release)
fig.canvas.mpl_connect('motion_notify_event', self.on_move)
self.x0, self.y0 = circ.center
self.pressevent = None
def on_press(self, event):
if event.inaxes != ax:
return
if not circ.contains(event)[0]:
return
self.pressevent = event
def on_release(self, event):
self.pressevent = None
self.x0, self.y0 = circ.center
def on_move(self, event):
if self.pressevent is None or event.inaxes != self.pressevent.inaxes:
return
dx = event.xdata - self.pressevent.xdata
dy = event.ydata - self.pressevent.ydata
circ.center = self.x0 + dx, self.y0 + dy
line.set_clip_path(circ)
fig.canvas.draw()
handler = EventHandler()
plt.show()
Executando o Programa
Execute o programa e clique com o botão esquerdo e arraste o patch de círculo amarelo para movê-lo ao redor do gráfico. Você pode usar este efeito para inspecionar dados dentro da área circular.
Resumo
Neste laboratório, aprendemos como criar um efeito de lupa (looking glass effect) usando eventos de mouse em Matplotlib. Geramos dados aleatórios, plotamos os dados e criamos uma classe manipuladora de eventos para lidar com eventos de mouse. Ao clicar com o botão esquerdo e arrastar o patch de círculo amarelo, fomos capazes de movê-lo ao redor do gráfico e inspecionar dados dentro da área circular.