Observação
Clique aqui para baixar o código de exemplo completo
Escolha a demonstração do evento #
Você pode ativar a seleção definindo a propriedade "seletor" de um artista (por exemplo, um Matplotlib Line2D, Text, Patch, Polygon, AxesImage, etc.)
Há uma variedade de significados da propriedade picker:
Nenhum - a seleção está desativada para este artista (padrão)
bool - se True , a seleção será ativada e o artista disparará um evento de seleção se o evento do mouse estiver sobre o artista.
A configuração
pickradius
adicionará uma tolerância epsilon em pontos e o artista disparará um evento se seus dados estiverem dentro do epsilon do evento do mouse. Para alguns artistas, como linhas e coleções de patch, o artista pode fornecer dados adicionais para o evento pick que é gerado, por exemplo, os índices dos dados dentro do epsilon do evento pickfunção - se o seletor for chamado, é uma função fornecida pelo usuário que determina se o artista é atingido pelo evento do mouse.
hit, props = picker(artist, mouseevent)
para determinar o teste de acerto. Se o evento do mouse estiver sobre o artista, retorne hit=True e props é um dicionário de propriedades que você deseja adicionar aos atributos PickEvent.
Depois de habilitar um artista para seleção definindo a propriedade "picker", você precisa se conectar à tela da figura pick_event para obter retornos de chamada de seleção em eventos de pressionamento do mouse. Por exemplo,
def pick_handler(event):
mouseevent = event.mouseevent
artist = event.artist
# now do something with this...
O evento pick (matplotlib.backend_bases.PickEvent) que é passado para seu retorno de chamada é sempre disparado com dois atributos:
- evento do mouse
o evento do mouse que gera o evento pick.
O evento do mouse, por sua vez, possui atributos como x e y (as coordenadas no espaço de exibição, como pixels da esquerda, inferior) e xdata, ydata (as coordenadas no espaço de dados). Além disso, você pode obter informações sobre quais botões foram pressionados, quais teclas foram pressionadas, quais eixos o mouse está sobre, etc. Consulte matplotlib.backend_bases.MouseEvent para obter detalhes.
- artista
o matplotlib.artist que gerou o evento pick.
Além disso, certos artistas como Line2D e PatchCollection podem anexar metadados adicionais como os índices nos dados que atendem aos critérios do seletor (por exemplo, todos os pontos na linha que estão dentro da tolerância epsilon especificada)
Os exemplos abaixo ilustram cada um desses métodos.
Observação
Esses exemplos exercitam os recursos interativos do Matplotlib e isso não aparecerá na documentação estática. Por favor, execute este código em sua máquina para ver a interatividade.
Você pode copiar e colar partes individuais ou baixar o exemplo inteiro usando o link na parte inferior da página.
Seleção simples, linhas, retângulos e texto #
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)
def onpick1(event):
if isinstance(event.artist, Line2D):
thisline = event.artist
xdata = thisline.get_xdata()
ydata = thisline.get_ydata()
ind = event.ind
print('onpick1 line:', np.column_stack([xdata[ind], ydata[ind]]))
elif isinstance(event.artist, Rectangle):
patch = event.artist
print('onpick1 patch:', patch.get_path())
elif isinstance(event.artist, Text):
text = event.artist
print('onpick1 text:', text.get_text())
fig.canvas.mpl_connect('pick_event', onpick1)
11
Seleção com uma função de teste de clique personalizada #
Você pode definir seletores personalizados definindo o seletor como uma função chamável. A função tem a assinatura:
hit, props = func(artist, mouseevent)
para determinar o teste de acerto. Se o evento do mouse estiver sobre o artista, retorne
hit=True
e props
seja um dicionário de propriedades que você deseja adicionar aos PickEvent
atributos.
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)
11
Escolhendo um gráfico de dispersão #
Um gráfico de dispersão é apoiado por um arquivo PathCollection
.
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)
11
Escolhendo imagens #
Imagens plotadas usando Axes.imshow
são AxesImage
objetos.
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)
plt.show()
Tempo total de execução do script: ( 0 minutos 1,456 segundos)