Nota
Fare clic qui per scaricare il codice di esempio completo
Scegli la demo dell'evento n.
Puoi abilitare la selezione impostando la proprietà "picker" di un artista (ad esempio, Matplotlib Line2D, Text, Patch, Polygon, AxesImage, ecc.)
Ci sono una varietà di significati della proprietà picker:
Nessuno - la selezione è disabilitata per questo artista (impostazione predefinita)
bool - se True , la selezione sarà abilitata e l'artista attiverà un evento di selezione se l'evento del mouse è sopra l'artista.
L'impostazione
pickradius
aggiungerà una tolleranza epsilon in punti e l'artista attiverà un evento se i suoi dati sono all'interno di epsilon dell'evento del mouse. Per alcuni artisti come le linee e le raccolte di patch, l'artista può fornire dati aggiuntivi all'evento pick generato, ad esempio gli indici dei dati all'interno di epsilon dell'evento pickfunction - se picker è richiamabile, è una funzione fornita dall'utente che determina se l'artista viene colpito dall'evento del mouse.
hit, props = picker(artist, mouseevent)
per determinare l'hit test. Se l'evento del mouse è sopra l'artista, restituisce hit=True e props è un dizionario di proprietà che vuoi aggiungere agli attributi PickEvent.
Dopo aver abilitato un artista per la selezione impostando la proprietà "picker", è necessario connettersi alla figura canvas pick_event per ottenere i callback di selezione sugli eventi di pressione del mouse. Per esempio,
def pick_handler(event):
mouseevent = event.mouseevent
artist = event.artist
# now do something with this...
L'evento pick (matplotlib.backend_bases.PickEvent) che viene passato al tuo callback viene sempre attivato con due attributi:
- mouseevent
l'evento mouse che genera l'evento pick.
L'evento del mouse a sua volta ha attributi come x e y (le coordinate nello spazio di visualizzazione, come pixel da sinistra, in basso) e xdata, ydata (le coordinate nello spazio dati). Inoltre, puoi ottenere informazioni su quali pulsanti sono stati premuti, quali tasti sono stati premuti, su quali assi si trova il mouse, ecc. Vedi matplotlib.backend_bases.MouseEvent per i dettagli.
- artista
il matplotlib.artist che ha generato l'evento pick.
Inoltre, alcuni artisti come Line2D e PatchCollection possono allegare metadati aggiuntivi come gli indici nei dati che soddisfano i criteri di selezione (ad esempio, tutti i punti nella linea che rientrano nella tolleranza epsilon specificata)
Gli esempi seguenti illustrano ognuno di questi metodi.
Nota
Questi esempi esercitano le capacità interattive di Matplotlib e questo non apparirà nella documentazione statica. Esegui questo codice sulla tua macchina per vedere l'interattività.
Puoi copiare e incollare singole parti o scaricare l'intero esempio utilizzando il link in fondo alla pagina.
Selezione semplice, linee, rettangoli e testo #
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
Scegliere con una funzione di hit test personalizzata #
Puoi definire selettori personalizzati impostando selettore su una funzione richiamabile. La funzione ha la firma:
hit, props = func(artist, mouseevent)
per determinare l'hit test. Se l'evento del mouse si trova sopra l'artista, restituisce
hit=True
ed props
è un dizionario delle proprietà che si desidera aggiungere agli PickEvent
attributi.
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
Scegliere un grafico a dispersione #
Un grafico a dispersione è supportato da un 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
Scegliere le immagini #
Le immagini tracciate utilizzando Axes.imshow
sono AxesImage
oggetti.
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 di esecuzione totale dello script: (0 minuti 1,456 secondi)