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 pickradiusaggiungerà 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 pick

  • function - 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.

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.patches import Rectangle
from matplotlib.text import Text
from matplotlib.image import AxesImage
import numpy as np
from numpy.random import rand


# Fixing random state for reproducibility
np.random.seed(19680801)

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)
fare clic su punti, rettangoli o testo
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=Trueed propsè un dizionario delle proprietà che si desidera aggiungere agli PickEventattributi.

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)
selettore personalizzato per i dati di linea
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)
scegli la demo dell'evento
11

Scegliere le immagini #

Le immagini tracciate utilizzando Axes.imshowsono 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()
scegli la demo dell'evento

Tempo di esecuzione totale dello script: (0 minuti 1,456 secondi)

Galleria generata da Sphinx-Gallery