matplotlib animation的官方文档:
http://matplotlib.org/api/animation_api.html
接下来完成一个实时获取cpu数值,并绘图的功能。
1.动画的骨架
初始化空数据,初始化图形大小和背景颜色,插入子图(三个数字分别表示几行几列第几个位置),初始化图形(数据为空)。
xdata = [] ydata = [] fig = plt.figure(figsize=(18, 8), facecolor="white") ax = fig.add_subplot(111) line, = ax.plot(xdata, ydata, color="red")
2.更新数据
1.更新x,y。
2.更新坐x/y轴。
参数data为迭代从FuncAnimation方法frames参数传进来的数值,这样就更新了下x,y,对图形的x/y轴大小做相应的重设,再把数据通过set_data传进图形,最后再把上述的变化通过draw()方法绘制到界面上,返回line给FuncAnimation方法。。
def update(data): x, y = data xdata.append(x) ydata.append(y) xmin, xmax = ax.get_xlim() if x >= xmax: ax.set_xlim(0, xmax+10) ax.figure.canvas.draw() line.set_data(xdata, ydata) return line,
3.获取数据
获取电脑cpu数值,并对x坐标累加。
def data_gen(): #设置xy变量 x = -1 while True: y = psutil.cpu_percent(interval=1) #获取cpu数值,1s获取一次。 x += 1 yield x,y
4.FuncAnimation方法
FuncAnimation方法主要是与update函数做交互,将frames参数对应的数据逐条传进update函数,再由update函数返回的图形覆盖FuncAnimation原先的图形,fig参数即为一开始对应的参数,interval为每次更新的时间间隔,还有其他一些参数如blit=True控制图形精细,当界面较多子图时,为True可以使得看起来不会太卡,关键是frames参数,
可为迭代数,可为函数,也可为空,
如果你指定一个大小,其迭代则从0开始到最后该数值停止。
如果你指定一个函数,在函数循环里不断获取数据,则可以无限循环下去。
ani = animation.FuncAnimation(fig, run, data_gen, blit=False, interval=1, repeat=False, init_func=init) plt.show()
完整代码:
#!/usr/bin/env python #-*-coding:utf-8 -*- import matplotlib.pyplot as plt import matplotlib.animation as animation import psutil def data_gen(): #设置xy变量 x = -1 while True: y = psutil.cpu_percent(interval=1) #获取cpu数值,1s获取一次。 x += 1 yield x,y def init(): ax.set_xlim(0, 10) ax.set_ylim(0, 100) del xdata[:] del ydata[:] line.set_data(xdata, ydata) return line, xdata = [] ydata = [] fig = plt.figure(figsize=(18, 8), facecolor="white") ax = fig.add_subplot(111) line, = ax.plot(xdata, ydata, color="red") # update the data def update(data): x, y = data xdata.append(x) ydata.append(y) xmin, xmax = ax.get_xlim() if x >= xmax: ax.set_xlim(0, xmax+10) ax.figure.canvas.draw() line.set_data(xdata, ydata) return line, ani = animation.FuncAnimation(fig,update,data_gen, blit=False, interval=1, repeat=False, init_func=init) plt.show()