網站首頁 編程語言 正文
一、背景
有些情況下,我們面對實時更新的數據,希望能夠在一個窗口中可視化出來,并且能夠實時更新,方便我們觀察數據的變化,從而進行數據分析,例如:繪制音頻的波形,繪制動態曲線等,下面介紹使用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
- 上一篇:C#實現冒泡排序和插入排序算法_C#教程
- 下一篇:C#實現希爾排序_C#教程
相關推薦
- 2023-03-15 k8s中pod使用詳解(云原生kubernetes)_云其它
- 2022-08-19 Android實現九宮格抽獎_Android
- 2022-07-14 C++類和對象深入探索之分文件編寫點和圓的關系詳解_C 語言
- 2023-02-27 ahooks?useInfiniteScroll源碼解析_React
- 2022-05-10 thymeleaf給響應頁面傳遞參數(modelandview 中的model)
- 2022-11-24 AOP?Redis自定義注解實現細粒度接口IP訪問限制_Redis
- 2022-05-05 Python學習之字典的常用方法總結_python
- 2022-11-24 詳解如何實現一個Kotlin函數類型_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支