选择事件演示#

您可以通过设置艺术家的“picker”属性来启用拾取(例如,Matplotlib Line2D、Text、Patch、Polygon、AxesImage 等)

picker 属性有多种含义:

  • - 禁用该艺术家的采摘(默认)

  • bool - 如果为True,则拾取将被启用,如果鼠标事件在艺术家上方,艺术家将触发一个拾取事件。

    设置pickradius将以点为单位添加一个 epsilon 容差,如果其数据在鼠标事件的 epsilon 范围内,则艺术家将触发一个事件。对于一些艺术家,如线条和补丁集合,艺术家可能会向生成的选取事件提供额外的数据,例如选取事件的 epsilon 内的数据索引

  • function - 如果选择器是可调用的,它是一个用户提供的函数,用于确定艺术家是否被鼠标事件击中。

    hit, props = picker(artist, mouseevent)
    

    确定命中测试。如果鼠标事件在艺术家上方,则返回 hit=True 并且 props 是要添加到 PickEvent 属性的属性字典。

通过设置“picker”属性启用艺术家进行拾取后,您需要连接到图形画布 pick_event 以获取鼠标按下事件的拾取回调。例如,

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

传递给回调的拾取事件 (matplotlib.backend_bases.PickEvent) 始终使用两个属性触发:

鼠标事件

产生pick事件的鼠标事件。

鼠标事件又具有 x 和 y(显示空间中的坐标,例如左、下像素)和 xdata、ydata(数据空间中的坐标)等属性。此外,您可以获取有关按下了哪些按钮、按下了哪些键、鼠标在哪个轴上等信息。有关详细信息,请参阅 matplotlib.backend_bases.MouseEvent。

艺术家

生成选择事件的 matplotlib.artist。

此外,某些艺术家(如 Line2D 和 PatchCollection)可能会将其他元数据(如索引)附加到满足选取器标准的数据中(例如,线中所有在指定 epsilon 容差范围内的点)

下面的示例说明了这些方法中的每一个。

笔记

这些例子锻炼了 Matplotlib 的交互能力,这不会出现在静态文档中。请在您的机器上运行此代码以查看交互性。

您可以复制和粘贴单个部分,或使用页面底部的链接下载整个示例。

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)

简单的拾取、线条、矩形和文本#

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

使用自定义命中测试功能进行选择#

您可以通过将选择器设置为可调用函数来定义自定义选择器。该函数具有签名:

hit, props = func(artist, mouseevent)

确定命中测试。如果鼠标事件在艺术家上方,则返回 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)
行数据的自定义选择器
11

在散点图上选择#

散点图由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

选择图像#

绘制的图像Axes.imshowAxesImage 对象。

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()
选择事件演示

脚本总运行时间:(0分1.456秒)

由 Sphinx-Gallery 生成的画廊