Nota
Haga clic aquí para descargar el código de ejemplo completo
Elija el número de demostración del evento
Puede habilitar la selección configurando la propiedad "selector" de un artista (por ejemplo, Matplotlib Line2D, Text, Patch, Polygon, AxesImage, etc.)
Hay una variedad de significados de la propiedad del selector:
Ninguno : la selección está deshabilitada para este artista (predeterminado)
bool: si es verdadero , se habilitará la selección y el artista activará un evento de selección si el evento del mouse está sobre el artista.
La configuración
pickradius
agregará una tolerancia épsilon en puntos y el artista disparará un evento si sus datos están dentro del épsilon del evento del mouse. Para algunos artistas, como líneas y colecciones de parches, el artista puede proporcionar datos adicionales al evento de selección que se genera, por ejemplo, los índices de los datos dentro de épsilon del evento de selección.función: si se puede llamar al selector, es una función proporcionada por el usuario que determina si el evento del mouse golpea al artista.
hit, props = picker(artist, mouseevent)
para determinar la prueba de impacto. Si el evento del mouse está sobre el artista, devuelva hit=True y props es un diccionario de propiedades que desea agregar a los atributos de PickEvent.
Una vez que haya habilitado a un artista para elegir configurando la propiedad "selector", debe conectarse al lienzo de la figura pick_event para obtener devoluciones de llamada de selección en eventos de presión del mouse. Por ejemplo,
def pick_handler(event):
mouseevent = event.mouseevent
artist = event.artist
# now do something with this...
El evento de selección (matplotlib.backend_bases.PickEvent) que se pasa a su devolución de llamada siempre se activa con dos atributos:
- evento del ratón
el evento del mouse que genera el evento de selección.
El evento del mouse, a su vez, tiene atributos como x e y (las coordenadas en el espacio de visualización, como píxeles desde la izquierda, abajo) y xdata, ydata (las coordenadas en el espacio de datos). Además, puede obtener información sobre qué botones se presionaron, qué teclas se presionaron, sobre qué ejes se encuentra el mouse, etc. Consulte matplotlib.backend_bases.MouseEvent para obtener más información.
- artista
el matplotlib.artist que generó el evento de selección.
Además, ciertos artistas como Line2D y PatchCollection pueden adjuntar metadatos adicionales como los índices a los datos que cumplen con los criterios del selector (por ejemplo, todos los puntos en la línea que están dentro de la tolerancia épsilon especificada)
Los ejemplos siguientes ilustran cada uno de estos métodos.
Nota
Estos ejemplos ejercitan las capacidades interactivas de Matplotlib, y esto no aparecerá en la documentación estática. Ejecute este código en su máquina para ver la interactividad.
Puede copiar y pegar partes individuales o descargar el ejemplo completo usando el enlace en la parte inferior de la página.
Selección simple, líneas, rectángulos y texto #
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
Selección con una función de prueba de acierto personalizada #
Puede definir selectores personalizados configurando selector en una función invocable. La función tiene la firma:
hit, props = func(artist, mouseevent)
para determinar la prueba de impacto. Si el evento del mouse está sobre el artista, regrese
hit=True
y props
es un diccionario de propiedades que desea agregar a los PickEvent
atributos.
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
Seleccionando un gráfico de dispersión #
Un gráfico de dispersión está respaldado por 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
Recogiendo imágenes #
Las imágenes trazadas usando Axes.imshow
son AxesImage
objetos.
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()
Tiempo total de ejecución del script: (0 minutos 1.456 segundos)