Choisissez la démo de l' événement

Vous pouvez activer le picking en définissant la propriété "picker" d'un artiste (par exemple, un Matplotlib Line2D, Text, Patch, Polygon, AxesImage, etc.)

Il existe une variété de significations de la propriété picker :

  • Aucun - la sélection est désactivée pour cet artiste (par défaut)

  • bool - si True , la sélection sera activée et l'artiste déclenchera un événement de sélection si l'événement de la souris est sur l'artiste.

    Le paramètre pickradiusajoutera une tolérance epsilon en points et l'artiste déclenchera un événement si ses données se trouvent à moins d'epsilon de l'événement de la souris. Pour certains artistes comme les lignes et les collections de patchs, l'artiste peut fournir des données supplémentaires à l'événement pick qui est généré, par exemple, les indices des données dans epsilon de l'événement pick

  • fonction - si le sélecteur est appelable, c'est une fonction fournie par l'utilisateur qui détermine si l'artiste est touché par l'événement de la souris.

    hit, props = picker(artist, mouseevent)
    

    pour déterminer le test de réussite. Si l'événement de souris est sur l'artiste, renvoyez hit=True et props est un dictionnaire de propriétés que vous souhaitez ajouter aux attributs PickEvent.

Après avoir activé un artiste pour la sélection en définissant la propriété "picker", vous devez vous connecter au canevas de la figure pick_event pour obtenir des rappels de sélection sur les événements de pression de la souris. Par exemple,

def pick_handler(event):
    mouseevent = event.mouseevent
    artist = event.artist
    # now do something with this...

L'événement pick (matplotlib.backend_bases.PickEvent) qui est passé à votre rappel est toujours déclenché avec deux attributs :

événement de souris

l'événement de souris qui génère l'événement de sélection.

L'événement de souris a à son tour des attributs comme x et y (les coordonnées dans l'espace d'affichage, comme les pixels de gauche, en bas) et xdata, ydata (les coordonnées dans l'espace de données). De plus, vous pouvez obtenir des informations sur les boutons qui ont été enfoncés, les touches qui ont été enfoncées, les axes sur lesquels se trouve la souris, etc. Voir matplotlib.backend_bases.MouseEvent pour plus de détails.

artiste

le matplotlib.artist qui a généré l'événement pick.

De plus, certains artistes comme Line2D et PatchCollection peuvent joindre des métadonnées supplémentaires comme les indices dans les données qui répondent aux critères du sélecteur (par exemple, tous les points de la ligne qui se situent dans la tolérance epsilon spécifiée)

Les exemples ci-dessous illustrent chacune de ces méthodes.

Noter

Ces exemples exerce les capacités interactives de Matplotlib, et cela n'apparaîtra pas dans la documentation statique. Veuillez exécuter ce code sur votre machine pour voir l'interactivité.

Vous pouvez copier et coller des parties individuelles ou télécharger l'exemple complet en utilisant le lien au bas de la page.

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)

Sélection simple, lignes, rectangles et texte #

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)
cliquer sur des points, des rectangles ou du texte
11

Cueillette avec une fonction de test de frappe personnalisée #

Vous pouvez définir des sélecteurs personnalisés en définissant le sélecteur sur une fonction appelable. La fonction a la signature :

hit, props = func(artist, mouseevent)

pour déterminer le test de réussite. Si l'événement de la souris est sur l'artiste, renvoie hit=Trueet propsest un dictionnaire des propriétés que vous souhaitez ajouter aux PickEventattributs.

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)
sélecteur personnalisé pour les données de ligne
11

Choisir sur un nuage de points #

Un nuage de points est soutenu par 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)
choisir la démo de l'événement
11

Choisir des images #

Les images tracées à l'aide Axes.imshowsont des AxesImage objets.

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()
choisir la démo de l'événement

Durée totale d'exécution du script : (0 minutes 1,456 secondes)

Galerie générée par Sphinx-Gallery