Noter
Cliquez ici pour télécharger l'exemple de code complet
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
pickradius
ajoutera 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 pickfonction - 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.
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)
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=True
et props
est un dictionnaire des propriétés que vous souhaitez ajouter aux PickEvent
attributs.
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
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)
11
Choisir des images #
Les images tracées à l'aide Axes.imshow
sont 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()
Durée totale d'exécution du script : (0 minutes 1,456 secondes)