Hinweis
Zum Ende springen, um den vollständigen Beispielcode herunterzuladen.
Pick-Event-Demo#
Sie können das "Picking" aktivieren, indem Sie die Eigenschaft "picker" eines Künstlers (z. B. eines Matplotlib Line2D, Text, Patch, Polygon, AxesImage usw.) setzen.
Die Eigenschaft "picker" hat verschiedene Bedeutungen:
None - Picking ist für diesen Künstler deaktiviert (Standard)
bool - Wenn True, wird Picking aktiviert und der Künstler löst ein Pick-Event aus, wenn sich das Mausereignis über dem Künstler befindet.
Das Setzen von
pickradiusfügt eine Toleranz von Epsilon in Punkten hinzu, und der Künstler löst ein Event aus, wenn seine Daten innerhalb von Epsilon des Mausereignisses liegen. Für einige Künstler wie Linien und Patch-Kollektionen kann der Künstler zusätzliche Daten an das generierte Pick-Event anhängen, z. B. die Indizes der Daten innerhalb von Epsilon des Pick-Events.function - Wenn "picker" aufrufbar ist, handelt es sich um eine vom Benutzer bereitgestellte Funktion, die bestimmt, ob der Künstler vom Mausereignis getroffen wird.
hit, props = picker(artist, mouseevent)
um den Treffertest zu bestimmen. Wenn sich das Mausereignis über dem Künstler befindet, geben Sie hit=True zurück und props ist ein Wörterbuch mit Eigenschaften, die Sie den PickEvent-Attributen hinzufügen möchten.
Nachdem Sie einen Künstler für das Picking aktiviert haben, indem Sie die Eigenschaft "picker" gesetzt haben, müssen Sie sich mit dem pick_event der Figure Canvas verbinden, um Pick-Callback-Funktionen bei Mausdrückereignissen zu erhalten. Zum Beispiel:
def pick_handler(event):
mouseevent = event.mouseevent
artist = event.artist
# now do something with this...
Das Pick-Event (matplotlib.backend_bases.PickEvent), das an Ihre Callback-Funktion übergeben wird, wird immer mit zwei Attributen ausgelöst:
- mouseevent
das Mausereignis, das das Pick-Event generiert hat.
Das Mausereignis wiederum hat Attribute wie x und y (die Koordinaten im Anzeigeraum, z. B. Pixel von links, unten) und xdata, ydata (die Koordinaten im Datenraum). Zusätzlich können Sie Informationen darüber erhalten, welche Tasten gedrückt wurden, welche Tasten gedrückt wurden, über welche Achsen sich die Maus befindet usw. Siehe matplotlib.backend_bases.MouseEvent für Details.
- artist
der matplotlib.artist, der das Pick-Event generiert hat.
Zusätzlich können bestimmte Künstler wie Line2D und PatchCollection zusätzliche Metadaten anhängen, wie z. B. die Indizes in den Daten, die die Picker-Kriterien erfüllen (z. B. alle Punkte in der Linie, die innerhalb der angegebenen Epsilon-Toleranz liegen).
Die folgenden Beispiele veranschaulichen jede dieser Methoden.
Hinweis
Diese Beispiele nutzen die interaktiven Fähigkeiten von Matplotlib, und dies wird nicht in der statischen Dokumentation erscheinen. Bitte führen Sie diesen Code auf Ihrer Maschine aus, um die Interaktivität zu sehen.
Sie können einzelne Teile kopieren und einfügen oder das gesamte Beispiel über den Link am Ende der Seite herunterladen.
Einfaches Picking, Linien, Rechtecke und Text#
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)

Picking mit einer benutzerdefinierten Treffertestfunktion#
Sie können benutzerdefinierte Picker definieren, indem Sie "picker" auf eine aufrufbare Funktion setzen. Die Funktion hat die Signatur
hit, props = func(artist, mouseevent)
um den Treffertest zu bestimmen. Wenn sich das Mausereignis über dem Künstler befindet, geben Sie hit=True zurück und props ist ein Wörterbuch mit Eigenschaften, die Sie den Attributen von PickEvent hinzufügen möchten.
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)

Picking auf einem Scatterplot#
Ein Scatterplot wird von einer PathCollection unterstützt.

Picking von Bildern#
Bilder, die mit Axes.imshow geplottet werden, sind AxesImage-Objekte.
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()

Gesamtlaufzeit des Skripts: (0 Minuten 1,814 Sekunden)