Técnicas de Visualização Interativa com Matplotlib

Beginner

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

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.