Notiz
Klicken Sie hier , um den vollständigen Beispielcode herunterzuladen
Event-Demo # auswählen
Sie können die Auswahl aktivieren, indem Sie die Eigenschaft "Picker" eines Künstlers festlegen (z. B. eine Matplotlib Line2D, Text, Patch, Polygon, AxesImage usw.)
Es gibt verschiedene Bedeutungen der picker-Eigenschaft:
Keine - Auswahl ist für diesen Künstler deaktiviert (Standard)
bool - wenn True , dann wird die Auswahl aktiviert und der Künstler löst ein Auswahlereignis aus, wenn sich das Mausereignis über dem Künstler befindet.
Die Einstellung
pickradius
fügt eine Epsilon-Toleranz in Punkten hinzu und der Künstler löst ein Ereignis aus, wenn seine Daten innerhalb des Epsilon des Mausereignisses liegen. Bei einigen Künstlern wie Linien- und Patch-Sammlungen kann der Künstler dem Auswahlereignis, das erzeugt wird, zusätzliche Daten bereitstellen, beispielsweise die Indizes der Daten innerhalb des Epsilon des AuswahlereignissesFunktion - Wenn der 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 ermitteln. 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 die Auswahl aktiviert haben, indem Sie die Eigenschaft "picker" festgelegt haben, müssen Sie sich mit der Figurenleinwand pick_event verbinden, um Auswahlrückrufe bei Mausklickereignissen 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 Ihren Callback übergeben wird, wird immer mit zwei Attributen ausgelöst:
- Mausereignis
das Mausereignis, das das Auswahlereignis generiert.
Das Mausereignis wiederum hat Attribute wie x und y (die Koordinaten im Anzeigeraum, wie Pixel von links, unten) und xdata, ydata (die Koordinaten im Datenraum). Zusätzlich können Sie Informationen darüber erhalten, welche Schaltflächen gedrückt wurden, welche Tasten gedrückt wurden, über welchen Achsen sich die Maus befindet usw. Siehe matplotlib.backend_bases.MouseEvent für Details.
- Künstler
die matplotlib.artist, die das Pick-Ereignis generiert hat.
Darüber hinaus können bestimmte Künstler wie Line2D und PatchCollection zusätzliche Metadaten wie die Indizes an die Daten anhängen, die die Auswahlkriterien erfüllen (z. B. alle Punkte in der Linie, die innerhalb der angegebenen Epsilon-Toleranz liegen).
Die folgenden Beispiele veranschaulichen jede dieser Methoden.
Notiz
Diese Beispiele üben die interaktiven Fähigkeiten von Matplotlib aus und erscheinen nicht in der statischen Dokumentation. Bitte führen Sie diesen Code auf Ihrem Computer aus, um die Interaktivität zu sehen.
Sie können einzelne Teile kopieren und einfügen oder das gesamte Beispiel über den Link unten auf der Seite herunterladen.
Einfache Auswahl, 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)
11
Kommissionierung 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 ermitteln. Wenn sich das Mausereignis über dem Künstler befindet, kehren
Sie zurück hit=True
und ist ein Wörterbuch mit Eigenschaften, die Sie den Attributen props
hinzufügen möchten .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)
11
Auf einem Streudiagramm auswählen #
Ein Scatterplot wird von einem unterstützt 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
Bilder auswählen #
Mit geplottete Bilder Axes.imshow
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.456 Sekunden)