简介
在本实验中,我们将学习如何使用 Matplotlib 中的 RectangleSelector 和 EllipseSelector 小部件,从初始点击位置到当前鼠标位置绘制矩形或椭圆。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入必要的库
我们将首先导入必要的库:Matplotlib、Numpy 以及 RectangleSelector 和 EllipseSelector 小部件。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import EllipseSelector, RectangleSelector
定义选择回调函数
每当用户选择一个矩形或椭圆时,选择回调函数都会被调用。该函数将接收点击和释放事件作为参数,并打印出矩形或椭圆的坐标。
def select_callback(eclick, erelease):
"""
Callback for line selection.
*eclick* and *erelease* are the press and release events.
"""
x1, y1 = eclick.xdata, eclick.ydata
x2, y2 = erelease.xdata, erelease.ydata
print(f"({x1:3.2f}, {y1:3.2f}) --> ({x2:3.2f}, {y2:3.2f})")
print(f"The buttons you used were: {eclick.button} {erelease.button}")
定义切换选择器函数
每当用户按下“t”键时,切换选择器函数都会被调用。此函数将切换 RectangleSelector 和 EllipseSelector 小部件的活动状态。
def toggle_selector(event):
print('Key pressed.')
if event.key == 't':
for selector in selectors:
name = type(selector).__name__
if selector.active:
print(f'{name} deactivated.')
selector.set_active(False)
else:
print(f'{name} activated.')
selector.set_active(True)
创建图形和子图
我们将创建一个带有两个子图的图形,一个用于 RectangleSelector,另一个用于 EllipseSelector。
fig = plt.figure(layout='constrained')
axs = fig.subplots(2)
在子图上绘制一些内容
我们将在子图上绘制一些内容,以便用户可以看到矩形选择器(RectangleSelector)和椭圆选择器(EllipseSelector)的效果。
N = 100000 ## 如果 N 很大,使用双缓冲(blitting)可以看到性能提升。
x = np.linspace(0, 10, N)
for ax in axs:
ax.plot(x, np.sin(2*np.pi*x)) ## 绘制一些内容
创建矩形选择器和椭圆选择器小部件
我们将创建矩形选择器(RectangleSelector)和椭圆选择器(EllipseSelector)小部件,并将它们添加到子图中。
selectors = []
for ax, selector_class in zip(axs, [RectangleSelector, EllipseSelector]):
ax.set_title(f"Click and drag to draw a {selector_class.__name__}.")
selectors.append(selector_class(
ax, select_callback,
useblit=True,
button=[1, 3], ## 禁用中间按钮
minspanx=5, minspany=5,
spancoords='pixels',
interactive=True))
fig.canvas.mpl_connect('key_press_event', toggle_selector)
axs[0].set_title("Press 't' to toggle the selectors on and off.\n"
+ axs[0].get_title())
显示绘图
最后,我们将向用户显示绘图。
plt.show()
总结
在这个实验中,我们学习了如何在 Matplotlib 中使用矩形选择器(RectangleSelector)和椭圆选择器(EllipseSelector)小部件,从初始点击位置到当前鼠标位置绘制矩形或椭圆。我们还学习了如何创建带有子图的图形,在子图上绘制某些内容,以及使用按键事件切换小部件的活动状态。