使用 Matplotlib 创建窥视镜

Beginner

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

简介

本实验将指导你使用 Matplotlib 中的鼠标事件创建一个视镜效果。此示例将允许你在一个圆形区域中检查数据,该区域可以通过点击和拖动来移动。

虚拟机提示

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

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

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

导入所需库

我们需要导入 Matplotlib 库、NumPy 库以及 Matplotlib 的补丁模块。我们将使用这些库来创建视镜效果。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches

生成随机数据

我们将使用 NumPy 生成两组随机数据。这些数据将被绘制以创建一个散点图。

## Fixing random state for reproducibility
np.random.seed(19680801)

x, y = np.random.rand(2, 200)

创建图形和坐标轴

我们将使用 subplots() 函数创建图形和坐标轴对象。我们还将使用 patches.Circle() 函数向坐标轴对象添加一个黄色的圆形补丁。

fig, ax = plt.subplots()
circ = patches.Circle((0.5, 0.5), 0.25, alpha=0.8, fc='yellow')
ax.add_patch(circ)

绘制数据

我们将使用 plot() 函数两次绘制在步骤 2 中生成的随机数据。第一次绘制的透明度值为 0.2,第二次绘制的透明度值为 1.0,并将裁剪路径设置为黄色圆形补丁。

ax.plot(x, y, alpha=0.2)
line, = ax.plot(x, y, alpha=1.0, clip_path=circ)
ax.set_title("Left click and drag to move looking glass")

创建事件处理程序

我们将创建一个事件处理程序类,用于处理在绘图上移动黄色圆形补丁所需的鼠标事件。这个类将包含三个方法:on_press()on_release()on_move()

class EventHandler:
    def __init__(self):
        fig.canvas.mpl_connect('button_press_event', self.on_press)
        fig.canvas.mpl_connect('button_release_event', self.on_release)
        fig.canvas.mpl_connect('motion_notify_event', self.on_move)
        self.x0, self.y0 = circ.center
        self.pressevent = None

    def on_press(self, event):
        if event.inaxes!= ax:
            return

        if not circ.contains(event)[0]:
            return

        self.pressevent = event

    def on_release(self, event):
        self.pressevent = None
        self.x0, self.y0 = circ.center

    def on_move(self, event):
        if self.pressevent is None or event.inaxes!= self.pressevent.inaxes:
            return

        dx = event.xdata - self.pressevent.xdata
        dy = event.ydata - self.pressevent.ydata
        circ.center = self.x0 + dx, self.y0 + dy
        line.set_clip_path(circ)
        fig.canvas.draw()

handler = EventHandler()
plt.show()

运行程序

运行程序,然后左键点击并拖动黄色圆形补丁,使其在绘图上移动。你可以利用这个效果来查看圆形区域内的数据。

总结

在这个实验中,我们学习了如何在 Matplotlib 中使用鼠标事件创建一个窥视镜效果。我们生成了随机数据,绘制了数据,并创建了一个事件处理程序类来处理鼠标事件。通过左键点击并拖动黄色圆形补丁,我们能够在绘图上移动它,并查看圆形区域内的数据。