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

  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/-wenli/p/11894601.html
Copyright © 2020-2023  润新知