使用 Matplotlib 创建实时示波器

PythonPythonBeginner
立即练习

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

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

简介

本教程是一份关于如何使用 Python 的 Matplotlib 库创建示波器的分步指南。示波器是一种用于测量和显示随时间变化的电压信号的设备。在本教程中,我们将使用 Matplotlib 的动画模块来创建电压信号的实时显示。

虚拟机使用提示

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

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

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

导入库

在开始编码之前,我们需要导入必要的库。我们将使用 Matplotlib、NumPy 和动画模块。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from matplotlib.lines import Line2D

设置示波器类

Scope 类将保存我们创建示波器所需的数据和方法。在构造函数中,我们初始化必要的变量并设置绘图。

class Scope:
    def __init__(self, ax, maxt=2, dt=0.02):
        self.ax = ax
        self.dt = dt
        self.maxt = maxt
        self.tdata = [0]
        self.ydata = [0]
        self.line = Line2D(self.tdata, self.ydata)
        self.ax.add_line(self.line)
        self.ax.set_ylim(-.1, 1.1)
        self.ax.set_xlim(0, self.maxt)

定义更新方法

更新方法会在动画的每一帧被调用。它接收一个新值并相应地更新绘图。

def update(self, y):
        lastt = self.tdata[-1]
        if lastt >= self.tdata[0] + self.maxt:  ## reset the arrays
            self.tdata = [self.tdata[-1]]
            self.ydata = [self.ydata[-1]]
            self.ax.set_xlim(self.tdata[0], self.tdata[0] + self.maxt)
            self.ax.figure.canvas.draw()

        t = self.tdata[0] + len(self.tdata) * self.dt

        self.tdata.append(t)
        self.ydata.append(y)
        self.line.set_data(self.tdata, self.ydata)
        return self.line,

创建发射器函数

发射器函数生成将被传递到更新方法的数据。在这种情况下,我们以 0.1 的概率生成随机数据。

def emitter(p=0.1):
    while True:
        v = np.random.rand()
        if v > p:
            yield 0.
        else:
            yield np.random.rand()

设置绘图

我们创建一个新的图形和轴对象,并初始化 Scope 类。然后,我们将更新函数和发射器函数传递给 FuncAnimation 方法以创建动画。

fig, ax = plt.subplots()
scope = Scope(ax)

ani = animation.FuncAnimation(fig, scope.update, emitter, interval=50,
                              blit=True, save_count=100)

plt.show()

总结

在本教程中,我们学习了如何使用 Matplotlib 创建一个示波器,以显示随时间变化的电压信号。我们定义了一个 Scope 类来保存示波器所需的数据和方法,创建了一个更新方法来更新绘图,并使用发射器函数来生成数据。最后,我们设置了绘图,并将更新函数和发射器函数传递给 FuncAnimation 方法以创建动画。