使用 Matplotlib 小部件绘制形状

PythonPythonBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何使用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)小部件,从初始点击位置到当前鼠标位置绘制矩形或椭圆。我们还学习了如何创建带有子图的图形,在子图上绘制某些内容,以及使用按键事件切换小部件的活动状态。