简介
本实验演示了如何在 Matplotlib 中使用多边形选择工具从数据集中选择索引。多边形选择工具允许用户通过在图表上绘制多边形来选择点。然后,所选点将被突出显示,而未选点将逐渐淡化。所选点的索引保存在一个数组中,可用于进一步分析。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到笔记本标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入库
在这一步中,我们将为本实验导入必要的库。我们将使用 numpy 和 matplotlib 进行数据处理和可视化。
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 中使用多边形选择工具从散点图中选择索引。选择器类允许用户通过在点周围绘制多边形来选择点。所选的点会被突出显示,而未选的点会变淡。所选点的索引保存在一个数组中,可用于进一步分析。