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 pickradiusfü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 Auswahlereignisses

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

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)

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)
Klicken Sie auf Punkte, Rechtecke oder Text
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=Trueund ist ein Wörterbuch mit Eigenschaften, die Sie den Attributen propshinzufü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)
benutzerdefinierter Picker für Zeilendaten
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)
Event-Demo auswählen
11

Bilder auswählen #

Mit geplottete Bilder Axes.imshowsind 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()
Event-Demo auswählen

Gesamtlaufzeit des Skripts: ( 0 Minuten 1.456 Sekunden)

Galerie generiert von Sphinx-Gallery