备注
Go to the end 下载完整示例代码.
Pick 事件演示#
您可以通过设置 artist 的 "picker" 属性来启用picking(例如,Matplotlib Line2D,Text,Patch,Polygon,AxesImage 等)
picker 属性有多种含义:
None - 对此 artist 禁用 picking(默认)
bool - 如果为 True,则将启用 picking,并且如果鼠标事件位于 artist 上,则 artist 将触发 pick 事件.
设置
pickradius将添加一个点为单位的 epsilon 容差,如果 artist 的数据在鼠标事件的 epsilon 范围内,则 artist 将触发一个事件.对于某些 artist(如 lines 和 patch collections),artist 可能会为生成的 pick 事件提供额外的数据,例如,pick 事件的 epsilon 范围内的数据索引.function - 如果 picker 是可调用的,则它是一个用户提供的函数,用于确定 artist 是否被鼠标事件击中.:
hit, props = picker(artist, mouseevent)
确定命中测试.如果鼠标事件位于 artist 上,则返回 hit=True,props 是您要添加到 PickEvent 属性的属性字典.
在通过设置 "picker" 属性为 artist 启用了 picking 后,您需要连接到图形画布 pick_event 以获取鼠标按下事件的 pick 回调.例如,:
def pick_handler(event):
mouseevent = event.mouseevent
artist = event.artist
# now do something with this...
传递给您的回调的 pick 事件(matplotlib.backend_bases.PickEvent)总是触发两个属性:
- mouseevent
生成 pick 事件的鼠标事件.
鼠标事件反过来又具有诸如 x 和 y(显示空间中的坐标,例如,从左到右,从下到上的像素)和 xdata,ydata(数据空间中的坐标)之类的属性.此外,您可以获取有关按下哪些按钮,按下哪些键,鼠标位于哪个 Axes 上等信息.有关详细信息,请参见 matplotlib.backend_bases.MouseEvent.
- artist
生成 pick 事件的 matplotlib.artist.
此外,某些 artist(如 Line2D 和 PatchCollection)可能会附加额外的元数据,如满足 picker 条件的数据的索引(例如,行中在指定 epsilon 容差范围内的所有点)
以下示例说明了这些方法中的每一种.
备注
这些例子练习了 Matplotlib 的交互功能,这不会出现在静态文档中.请在您的机器上运行此代码以查看交互性.
您可以复制和粘贴各个部分,或者使用页面底部的链接下载整个示例.
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import rand
from matplotlib.image import AxesImage
from matplotlib.lines import Line2D
from matplotlib.patches import Rectangle
from matplotlib.text import Text
# Fixing random state for reproducibility
np.random.seed(19680801)
简单的 picking,线条,矩形和文本#
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)

使用自定义命中测试功能进行 Picking#
您可以通过将 picker 设置为可调用函数来定义自定义 picker.该函数具有以下签名:
hit, props = func(artist, mouseevent)
以确定命中测试.如果鼠标事件在 artist 上,则返回 hit=True 并且 props 是您要添加到 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)

在散点图上进行 Pick#
散点图由 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)

挑选图像#
使用 Axes.imshow 绘制的图像是 AxesImage 对象.
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()