python多线程实现动态图绘制

作者:浅若清风cyf? 时间:2023-10-22 21:53:53 

一、背景

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

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

直接上图:

python多线程实现动态图绘制

二、步骤

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多线程实现动态图绘制

来源:https://juejin.cn/post/7085002428495429668

标签:python,多线程,动态图,绘制
0
投稿

猜你喜欢

  • 如何用electron把vue项目打包为桌面应用exe文件

    2024-06-05 10:03:16
  • 在函数间不能传递32个以上参数的疑难问题

    2008-12-31 13:31:00
  • python机器学习之神经网络(二)

    2021-12-21 08:41:54
  • python3实现UDP协议的服务器和客户端

    2022-07-01 09:17:08
  • asp利用XMLHTTP无刷新自动更新数据

    2007-08-23 13:16:00
  • python判断、获取一张图片主色调的2个实例

    2022-07-26 18:27:00
  • Python元组的定义及使用

    2021-06-30 01:24:40
  • 在 Python 中接管键盘中断信号的实现方法

    2022-11-25 15:14:55
  • C#基于数据库存储过程的AJAX分页实例

    2024-01-26 20:43:23
  • Python中selenium库的用法详解

    2021-06-26 00:29:41
  • Python cv.Canny()方法参数与使用方法

    2023-10-06 07:24:37
  • python函数运行内存时间等性能检测工具

    2021-04-08 02:24:00
  • python实现简单石头剪刀布游戏

    2023-03-08 03:23:44
  • 教你利用PyTorch实现sin函数模拟

    2021-06-23 18:17:25
  • 关于pycharm找不到MySQLdb模块的解决方法

    2024-01-13 01:51:20
  • python中time.ctime()实例用法

    2022-11-09 05:25:32
  • Pandas对每个分组应用apply函数的实现

    2022-01-26 04:02:00
  • Python3之乱码\\xe6\\x97\\xa0\\xe6\\xb3\\x95处理方式

    2021-03-30 10:19:47
  • Python实现操作Redis的高级用法分享

    2022-07-29 04:26:29
  • Python使用GitPython操作Git版本库的方法

    2021-04-28 07:22:16
  • asp之家 网络编程 m.aspxhome.com