zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    结构struct 联合Union和枚举Enum的细节讨论
    ubuntu 查询 修改 时间
    在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
    浅谈Android系统开发中LOG的使用
    如何单独编译Android源代码中的模块
    在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
    在Ubuntu上为Android系统编写Linux内核驱动程序
    在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务
    在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
    在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
  • 原文地址:https://www.cnblogs.com/-wenli/p/11894601.html
Copyright © 2011-2022 走看看