简介
在本实验中,你将学习如何使用 Matplotlib 库创建一个交互式绘图,该绘图允许用户使用套索工具选择一组点。你还将学习如何使用回调函数来更改所选点的颜色。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入库
首先,导入本实验所需的库。我们将使用 matplotlib 创建绘图,并使用 numpy 生成随机数据。
import matplotlib.pyplot as plt
import numpy as np
创建套索管理器类
接下来,创建用于处理套索功能的 LassoManager 类。__init__ 方法初始化绘图和集合对象。callback 方法更改所选点的颜色,on_press 和 on_release 方法处理鼠标事件。
class LassoManager:
def __init__(self, ax, data):
## 一个点是否被选中的信息存储在集合的数组中(0 = 外部,1 = 内部),然后通过颜色映射为蓝色(外部)和红色(内部)。
self.collection = RegularPolyCollection(
6, sizes=(100,), offset_transform=ax.transData,
offsets=data, array=np.zeros(len(data)),
clim=(0, 1), cmap=mcolors.ListedColormap(["tab:blue", "tab:red"]))
ax.add_collection(self.collection)
canvas = ax.figure.canvas
canvas.mpl_connect('button_press_event', self.on_press)
canvas.mpl_connect('button_release_event', self.on_release)
def callback(self, verts):
data = self.collection.get_offsets()
self.collection.set_array(path.Path(verts).contains_points(data))
canvas = self.collection.figure.canvas
canvas.draw_idle()
del self.lasso
def on_press(self, event):
canvas = self.collection.figure.canvas
if event.inaxes is not self.collection.axes or canvas.widgetlock.locked():
return
self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata), self.callback)
canvas.widgetlock(self.lasso) ## 获取对小部件绘图的锁定
def on_release(self, event):
canvas = self.collection.figure.canvas
if hasattr(self, 'lasso') and canvas.widgetlock.isowner(self.lasso):
canvas.widgetlock.release(self.lasso)
创建绘图
现在,使用 LassoManager 类创建一个交互式绘图。np.random.rand 函数生成将被绘制的随机数据点。
if __name__ == '__main__':
np.random.seed(19680801)
ax = plt.figure().add_subplot(
xlim=(0, 1), ylim=(0, 1), title='Lasso points using left mouse button')
manager = LassoManager(ax, np.random.rand(100, 2))
plt.show()
总结
在本实验中,你学习了如何使用 Matplotlib 创建一个交互式绘图,该绘图允许用户使用套索工具选择一组点。你还学习了如何使用回调函数来更改所选点的颜色。此功能可以扩展到其他需要交互式数据选择的项目中。