Introdução
Este laboratório tem como objetivo apresentar o conceito de picking (seleção) no Matplotlib. A capacidade de selecionar artists (elementos gráficos) é uma ferramenta poderosa que pode ser usada para construir visualizações interativas que respondem às ações do usuário. Abordaremos a seleção simples, a seleção com funções de teste de acerto personalizadas, a seleção em um gráfico de dispersão (scatter plot) e a seleção de imagens.
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ê.
Seleção Simples, Linhas, Retângulos e Texto
Começaremos habilitando a seleção simples definindo a propriedade "picker" de um artist (elemento gráfico). Isso permitirá que o artist dispare um evento de seleção se o evento do mouse estiver sobre o artist. Criaremos um gráfico simples contendo uma linha, um retângulo e texto, e habilitaremos a seleção em cada um desses artists.
fig, (ax1, ax2) = plt.subplots(2, 1)
ax1.set_title('click on points, rectangles or text', picker=True)
ax1.set_ylabel('ylabel', picker=True, bbox=dict(facecolor='red'))
line, = ax1.plot(rand(100), 'o', picker=True, pickradius=5)
## Pick the rectangle.
ax2.bar(range(10), rand(10), picker=True)
for label in ax2.get_xticklabels(): ## Make the xtick labels pickable.
label.set_picker(True)
Criando uma Função de Teste de Acerto Personalizada
Nesta etapa, definiremos um picker (seletor) personalizado definindo "picker" como uma função chamável. A função determinará se o artist (elemento gráfico) foi atingido pelo evento do mouse. Se o evento do mouse estiver sobre o artist, retornaremos hit=True e props será um dicionário de propriedades que você deseja adicionar aos atributos .PickEvent.
def line_picker(line, mouseevent):
"""
Find the points within a certain distance from the mouseclick in
data coords and attach some extra attributes, pickx and picky
which are the data points that were picked.
"""
if mouseevent.xdata is None:
return False, dict()
xdata = line.get_xdata()
ydata = line.get_ydata()
maxd = 0.05
d = np.sqrt(
(xdata - mouseevent.xdata)**2 + (ydata - mouseevent.ydata)**2)
ind, = np.nonzero(d <= maxd)
if len(ind):
pickx = xdata[ind]
picky = ydata[ind]
props = dict(ind=ind, pickx=pickx, picky=picky)
return True, props
else:
return False, dict()
def onpick2(event):
print('onpick2 line:', event.pickx, event.picky)
fig, ax = plt.subplots()
ax.set_title('custom picker for line data')
line, = ax.plot(rand(100), rand(100), 'o', picker=line_picker)
fig.canvas.mpl_connect('pick_event', onpick2)
Seleção em um Gráfico de Dispersão (Scatter Plot)
Um gráfico de dispersão é suportado por um ~matplotlib.collections.PathCollection. Criaremos um gráfico de dispersão e habilitaremos a seleção.
x, y, c, s = rand(4, 100)
def onpick3(event):
ind = event.ind
print('onpick3 scatter:', ind, x[ind], y[ind])
fig, ax = plt.subplots()
ax.scatter(x, y, 100*s, c, picker=True)
fig.canvas.mpl_connect('pick_event', onpick3)
Selecionando Imagens
Imagens plotadas usando .Axes.imshow são objetos ~matplotlib.image.AxesImage. Criaremos uma figura com múltiplas imagens e habilitaremos a seleção.
fig, ax = plt.subplots()
ax.imshow(rand(10, 5), extent=(1, 2, 1, 2), picker=True)
ax.imshow(rand(5, 10), extent=(3, 4, 1, 2), picker=True)
ax.imshow(rand(20, 25), extent=(1, 2, 3, 4), picker=True)
ax.imshow(rand(30, 12), extent=(3, 4, 3, 4), picker=True)
ax.set(xlim=(0, 5), ylim=(0, 5))
def onpick4(event):
artist = event.artist
if isinstance(artist, AxesImage):
im = artist
A = im.get_array()
print('onpick4 image', A.shape)
fig.canvas.mpl_connect('pick_event', onpick4)
Resumo
Neste laboratório, aprendemos como habilitar a seleção (picking) em vários artistas no Matplotlib, incluindo linhas, retângulos, texto, gráficos de dispersão (scatter plots) e imagens. Também aprendemos como definir funções de teste de acerto (hit test functions) personalizadas para habilitar um comportamento de seleção mais complexo. Essa ferramenta poderosa nos permite criar visualizações interativas que respondem às ações do usuário.