示波器
模拟示波器。

import numpy as npfrom matplotlib.lines import Line2Dimport matplotlib.pyplot as pltimport matplotlib.animation as animationclass Scope(object):def __init__(self, ax, maxt=2, dt=0.02):self.ax = axself.dt = dtself.maxt = maxtself.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 arraysself.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[-1] + self.dtself.tdata.append(t)self.ydata.append(y)self.line.set_data(self.tdata, self.ydata)return self.line,def emitter(p=0.03):'return a random value with probability p, else 0'while True:v = np.random.rand(1)if v > p:yield 0.else:yield np.random.rand(1)# Fixing random state for reproducibilitynp.random.seed(19680801)fig, ax = plt.subplots()scope = Scope(ax)# pass a generator in "emitter" to produce data for the update funcani = animation.FuncAnimation(fig, scope.update, emitter, interval=10,blit=True)plt.show()
