python多线程实现动态图绘制

 更新时间:2022年04月15日 13:42:18   作者:浅若清风cyf   
这篇文章主要介绍了python多线程实现动态图绘制,文章基于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多线程实现动态图绘制的文章就介绍到这了,更多相关python绘制动态图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3+Appium安装及Appium模拟微信登录方法详解

    Python3+Appium安装及Appium模拟微信登录方法详解

    这篇文章主要介绍了Python3+Appium安装及使用方法详解,需要的朋友可以参考下
    2021-02-02
  • Python的Flask框架Request请求对象详解

    Python的Flask框架Request请求对象详解

    这篇文章主要介绍了Python的Flask框架Request请求对象详解,Flask是一个轻量级的基于Python的web框架,使用 method 属性可以操作当前请求方法,通过使用 form 属性处理表单数据,需要的朋友可以参考下
    2023-08-08
  • Python学习之基础语法介绍

    Python学习之基础语法介绍

    大家好,本篇文章主要讲的是Python学习之基础语法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • python基于tkinter实现gif录屏功能

    python基于tkinter实现gif录屏功能

    一直在思索实现一个透明的窗体,然后可以基于这个窗体可以开发出各种好玩的应用,这一期,我们将实现有趣的GIF录屏功能
    2021-05-05
  • python实现剪切功能

    python实现剪切功能

    这篇文章主要为大家详细介绍了一段python代码编写实现的剪切功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 如何给Python代码进行加密

    如何给Python代码进行加密

    这篇文章主要介绍了如何给Python代码进行加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Python单向链表和双向链表原理与用法实例详解

    Python单向链表和双向链表原理与用法实例详解

    这篇文章主要介绍了Python单向链表和双向链表原理与用法,结合实例形式详细分析了单向链表与双向链表的概念、原理以及创建、添加、删除等相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • Python多线程应用于自动化测试操作示例

    Python多线程应用于自动化测试操作示例

    这篇文章主要介绍了Python多线程应用于自动化测试操作,结合实例形式分析了Python多线程基于Selenium进行自动化操作相关实现技巧,需要的朋友可以参考下
    2018-12-12
  • pymssql数据库操作MSSQL2005实例分析

    pymssql数据库操作MSSQL2005实例分析

    这篇文章主要介绍了pymssql数据库操作MSSQL2005的方法,可实现基本的连接、查询、插入、更新及调用存储过程等功能,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • python中的项目目录结构

    python中的项目目录结构

    这篇文章主要介绍了python中的项目目录结构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论