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
0
投稿
猜你喜欢
- 本文中,abigale代表查询字符串,ada代表数据表名,alice代表字段名。技巧一:问题类型:ACCESS数据库字段中含有日文片假名或其
- 今天想直观的展示一下数据就用到了matplotlib模块,之前都是一张图只有一条曲线,现在想同一个图片上绘制多条曲线来对比,实现很简单,具体
- 本文为大家分享了python搭建服务器实现两个Android客户端间收发消息,供大家参考,具体内容如下python服务器# coding:u
- LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要
- 在python中,我们定义好一个字符串,如下所示。在python中定义个字符串然后把它赋值给一个变量。我们可以通过下标访问单个的字符,跟所有
- swagger介绍Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言。Swagger与一组开源软件工具
- 分享人:轻侯设计师常有这样的疑惑:如何知道用户浏览网页的习惯?如何设计出符合用户使用习惯的网页?如何从搜索引擎带来更多的流量?眼动研究可以帮
- 前言在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本。映射到数据库中。创建
- 今天解析DEDECMS时发现deder的MYSQL时间字段,都是用`senddata` int(10) unsigned NOT NULL
- 一、安装 FastAPI 和uvicorn可以使用 pip 命令进行安装:pip install fastapi uvicorn二、创建&n
- 左右结构是平常页面中最经常看到的结构,简洁一些的页面就会使用边框将左右两边隔开,但往往由于左右两边的内容可能是不等高的,所以就会有一高一低的
- python书写爬虫的一个框架,它也提供了多种类型爬虫的基类,scrapy用途广泛,可以用于数据挖掘、监测和自动化测试首先要先安装pytho
- SQL Server 6.5作为面向中小型企业的网络数据库服务系统,提供了 与众多高级数据库管理器相同的运行性能,向传统的数据库厂商发起了强
- 本文实例讲述了CodeIgniter分页类pagination使用方法。分享给大家供大家参考,具体如下:controller控制器(appl
- 之前写了一个matlab的,越用越觉得麻烦,如果不同数据集要改类别数目,而且运行速度慢。所以重新写了一个Python的,直接读取xml文件夹
- 首先需要安装chardet库,有很多方式,我才用的是比较笨的方式:sudo pip install chardet#!/usr/bin/en
- 1. 简介本文将介绍 Go 语言中的 sync.Cond 并发原语,包括 sync.Cond的基本使用方法、实现原理、使用注意事项以及常见的
- ipython简介ipython他是一个非常流行的python解释器,相比于原生的python解释器,有太多优点和长处,因此几乎是pytho
- 酝酿了将近一个春夏秋冬的腾讯网首页终于亮剑!反响热烈!让我们来分享它成功背后的酸甜苦辣吧。腾讯网首页改版终于开花结果。于2008年3月25日
- 美化主要表现在鼠标放到菜单上后(即鼠标悬停)的效果,这里首先介绍几个经常用到的CSS属性:backgr