使用多边形选择器选择索引

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验演示了如何在Matplotlib中使用多边形选择工具从数据集中选择索引。多边形选择工具允许用户通过在图表上绘制多边形来选择点。然后,所选点将被突出显示,而未选点将逐渐淡化。所选点的索引保存在一个数组中,可用于进一步分析。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

在这一步中,我们将为本实验导入必要的库。我们将使用 numpymatplotlib 进行数据处理和可视化。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.widgets import PolygonSelector

创建数据

在这一步中,我们将创建一些数据用于可视化。我们将在网格上创建一个点的散点图。

fig, ax = plt.subplots()
grid_size = 5
grid_x = np.tile(np.arange(grid_size), grid_size)
grid_y = np.repeat(np.arange(grid_size), grid_size)
pts = ax.scatter(grid_x, grid_y)

定义选择器类

在这一步中,我们将定义一个类,该类将允许我们使用多边形选择工具从散点图中选择点。这个类会将所选点的索引保存在一个数组中。

class SelectFromCollection:
    """
    使用 `PolygonSelector` 从matplotlib集合中选择索引。

    所选索引保存在 `ind` 属性中。此工具会淡化不属于所选内容的点(即降低它们的透明度值)。如果你的集合的透明度小于1,此工具将永久更改透明度值。

    请注意,此工具根据集合对象的 *原点*(即 `offsets`)来选择它们。

    参数
    ----------
    ax : `~matplotlib.axes.Axes`
        要交互的轴。
    collection : `matplotlib.collections.Collection` 的子类
        你要从中选择的集合。
    alpha_other : 0 <= 浮点数 <= 1
        为了突出显示所选内容,此工具将所有选定的点设置为透明度值1,未选定的点设置为 *alpha_other*。
    """

    def __init__(self, ax, collection, alpha_other=0.3):
        self.canvas = ax.figure.canvas
        self.collection = collection
        self.alpha_other = alpha_other

        self.xys = collection.get_offsets()
        self.Npts = len(self.xys)

        ## 确保每个对象都有单独的颜色
        self.fc = collection.get_facecolors()
        if len(self.fc) == 0:
            raise ValueError('集合必须有一个面颜色')
        elif len(self.fc) == 1:
            self.fc = np.tile(self.fc, (self.Npts, 1))

        self.poly = PolygonSelector(ax, self.onselect, draw_bounding_box=True)
        self.ind = []

    def onselect(self, verts):
        path = Path(verts)
        self.ind = np.nonzero(path.contains_points(self.xys))[0]
        self.fc[:, -1] = self.alpha_other
        self.fc[self.ind, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

    def disconnect(self):
        self.poly.disconnect_events()
        self.fc[:, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()

创建选择器对象

在这一步中,我们将创建一个在第3步中定义的选择器类的实例。这将允许我们使用多边形选择工具从散点图中选择点。

selector = SelectFromCollection(ax, pts)

选择点

在这一步中,我们将使用多边形选择工具从散点图中选择点。我们可以通过在点周围绘制一个多边形来选择它们。所选的点将被突出显示,而未选的点将变淡。

print("通过在多边形内包围来选择图中的点。")
print("按'esc'键开始一个新的多边形。")
print("尝试按住'shift'键移动所有顶点。")
print("尝试按住'ctrl'键移动单个顶点。")
plt.show()

断开选择器对象的连接

在这一步中,我们将断开选择器对象的连接,以释放多边形选择工具所使用的资源。

selector.disconnect()

打印所选点

在这一步中,我们将打印所选点的坐标。

print('\n所选点:')
print(selector.xys[selector.ind])

总结

本实验展示了如何在Matplotlib中使用多边形选择工具从散点图中选择索引。选择器类允许用户通过在点周围绘制多边形来选择点。所选的点会被突出显示,而未选的点会变淡。所选点的索引保存在一个数组中,可用于进一步分析。