python matplotlib动态绘图

 

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()

 

 

 

 

posted @ 2019-11-20 00:19  -零  阅读(3270)  评论(1编辑  收藏  举报