温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python多线程怎么实现动态图绘制

发布时间:2022-04-15 15:49:08 来源:亿速云 阅读:257 作者:iii 栏目:开发技术

今天小编给大家分享一下python多线程怎么实现动态图绘制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、背景

    有些情况下,我们面对实时更新的数据,希望能够在一个窗口中可视化出来,并且能够实时更新,方便我们观察数据的变化,从而进行数据分析,例如:绘制音频的波形,绘制动态曲线等,下面介绍使用matplotlib结合多线程绘制动态图,希望能帮助到有需要的朋友。

    遇到的场景:最近刚好在学习人工智能中的遗传算法,并且使用该算法求解TSP,了解这个算法的朋友知道这个算法是通过不断迭代,寻找适应度大的最优解,为了了解迭代过程中适应度的变化,我希望能够实时更新迭代过程中的适应度,将其可视化出来(数据量不断增大)

    二、步骤

    1、使用matplotlib绘制动态图

    • 工具:matplotlib.animation

    2、创建一个线程用于更新数据

    • threading

    三、代码框架

    # Author: 浅若清风cyf
    # Date: 2020/12/11
    
    import threading
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    import matplotlib.lines as line
    import numpy as np
    
    CHUNK = 2048  # 初始数据量
    data=np.random.normal(0,1,CHUNK)  # 存放数据,用于绘制图像,数据类型可为列表
    
    # 定义画布
    fig = plt.figure()
    ax = plt.subplot(111,ylim=(0,5))
    line = line.Line2D([], [])  # 绘制直线
    
    # 初始化图像
    def plot_init():
        ax.add_line(line)
        return line, # 必须加逗号,否则会报错(TypeError: 'Line2D' object is not iterable)
    
    # 更新图像(animation会不断调用此函数刷新图像,实现动态图的效果)
    def plot_update(i):
        global data  # data为全局变量
        data_copy = data.copy()  # 为避免线程不同步导致获取到的data在绘制图像时被更新,这里复制数据的副本,否则绘制图像的时候可能会出现x和y的数据维度不相等的情况
        x_data=np.arange(0,data_copy.shape[0],1)  # x轴根据y轴数据自动生成(可根据需要修改)
        ax.set_xlim(0,data_copy.shape[0])  # 横坐标范围(横坐标的范围和刻度可根据数据长度更新)
        ax.set_title("title",fontsize=8)  # 设置title
        line.set_xdata(x_data)  # 更新直线的数据
        line.set_ydata(data_copy)  # 更新直线的数据
    	# 大标题(若有多个子图,可为其设置大标题)
        plt.suptitle('Suptitle',fontsize=8)
        # 重新渲染子图
        ax.figure.canvas.draw()  # 必须加入这一行代码,才能更新title和坐标!!!
        return line,  # 必须加逗号,否则会报错(TypeError: 'Line2D' object is not iterable)
    
    # 绘制动态图
    ani = animation.FuncAnimation(fig,   # 画布
    							  plot_update,  # 图像更新
                                  init_func=plot_init,  # 图像初始化
                                  frames=1,
                                  interval=30,  # 图像更新间隔
                                  blit=True)
    
    # 数据更新函数
    def dataUpdate_thead():
        global data
        # 为了方便理解代码,这里生成正态分布的随机数据
        while True:  # 为了方便测试,让数据不停的更新
    	    data=np.random.normal(0,1,CHUNK)
    
    # 为数据更新函数单独创建一个线程,与图像绘制的线程并发执行
    ad_rdy_ev = threading.Event()
    ad_rdy_ev.set()  # 设置线程运行
    t = threading.Thread(target=dataUpdate_thead, args=()) # 更新数据,参数说明:target是线程需要执行的函数,args是传递给函数的参数)
    t.daemon = True
    t.start()  # 线程执行
    
    plt.show() # 显示图像(0,1,CHUNK)
    
    # 为数据更新函数单独创建一个线程,与图像绘制的线程并发执行
    ad_rdy_ev = threading.Event()
    ad_rdy_ev.set()  # 设置线程运行
    t = threading.Thread(target=dataUpdate_thead, args=()) # 更新数据,参数说明:target是线程需要执行的函数,args是传递给函数的参数)
    t.daemon = True
    t.start()  # 线程执行
    
    plt.show() # 显示图像

    以上就是“python多线程怎么实现动态图绘制”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI