python多线程实现动态图绘制
作者:浅若清风cyf? 发布时间:2023-10-22 21:53:53
标签: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() # 显示图像
效果:
来源:https://juejin.cn/post/7085002428495429668


猜你喜欢
- 这两条是关于IE环境中的CSS的。不要使用import引入CSS,可以避免内容的无样式瞬间(FOUC)问题。不要把样式的link放到页面后(
- 本文仅针对 Ubuntu 操作系统环境,其他系统环境待日后遇到再补充。本文主要内容参考Linux公社(https://www.linuxid
- 步骤1、安装Jupyterpip install jupyter2、 新建一个IPython文件3、在Terminal里启动Jupyter
- 分组小括号() 有直接分组和命名分组直接分组: ()分组只显示小括号括起来的内容re.findall(r"(name)+
- 本文实例为大家分享了Python绑定方法与非绑定方法,供大家参考,具体内容如下定义:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数
- 在计算机普及的现代设计领域,文字的设计的工作很大一部分由计算机代替人脑完成了(很多平面设计软件中都有制作艺术汉字的引导,以及提供了数十上百种
- “占位图形”顾名思义是在准备好将最终图形添加到 Web 页之前使用的临时图形。使用它可以在没有理想的图形的情况下先行制作Web页面——在需要
- 实际开发中,有时候系统提供的异常类型不能满足开发的需求。这时候你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception
- var str='1250' ; alert( Number(str) ); //得到1250 alert(parseInt
- Jquery中的一些东西学习一下子,补充完善一下,毕竟有些时候没有使用到这个方式很有用,在使用bootstrap table的时候,选择当前
- 如下所示:string =" { "status": "error", "mes
- 网上关于tensorflow模型文件ckpt格式转pb文件的帖子很多,本人几乎尝试了所有方法,最后终于成功了,现总结如下。方法无外乎下面两种
- 虽然今年名义上已经不再管人了,但也不得不掺和进很多人事,这里想简单说说,即使不能帮助这个行业的从业者规划职业道路,也算是把之前摸过的路小结一
- 如今大部分网站仍然采用表格嵌套内容的方式来制作网站,虽然此方法对于我们来说比较熟悉、比较上手;但是,它却阻碍了一种更好的、更有亲和力的、更灵
- 当我们在Vue.js项目中引用图片时,关于图片路径有以下几种情形:使用一我们在data里面定义好图片路径imgUrl:'../ass
- 哈喽大家好,这里是滑稽研究所。看过我们图像处理系列的朋友,应该知道识别答题卡那期文章。其中利用opencv框架,完美的实现了答题卡填涂区
- 在SQL查询分析器执行以下代码就可以了。declare @t varchar(255),@c varchar(255)declare tab
- 今天展示一个利用pandas将json数据导入excel例子,主要利用的是pandas里的read_json函数将json数据转化为data
- pytorch retain_graph==True的作用说明总的来说进行一次backward之后,各个节点的值会清除,这样进行第二次bac
- 优先级队列概述队列,是数据结构中实现先进先出策略的一种数据结构。而优先队列则是带有优先级的队列,即先按优先级分类,然后相同优先级的再 进行排