python多線程實現(xiàn)動態(tài)圖繪制
一、背景
有些情況下,我們面對實時更新的數(shù)據(jù),希望能夠在一個窗口中可視化出來,并且能夠?qū)崟r更新,方便我們觀察數(shù)據(jù)的變化,從而進行數(shù)據(jù)分析,例如:繪制音頻的波形,繪制動態(tài)曲線等,下面介紹使用matplotlib結(jié)合多線程繪制動態(tài)圖,希望能幫助到有需要的朋友。
遇到的場景:最近剛好在學(xué)習(xí)人工智能中的遺傳算法,并且使用該算法求解TSP,了解這個算法的朋友知道這個算法是通過不斷迭代,尋找適應(yīng)度大的最優(yōu)解,為了了解迭代過程中適應(yīng)度的變化,我希望能夠?qū)崟r更新迭代過程中的適應(yīng)度,將其可視化出來(數(shù)據(jù)量不斷增大)
直接上圖:

二、步驟
1、使用matplotlib繪制動態(tài)圖
- 工具:matplotlib.animation
2、創(chuàng)建一個線程用于更新數(shù)據(jù)
- threading
三、代碼框架
# Author: 淺若清風(fēng)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 # 初始數(shù)據(jù)量
data=np.random.normal(0,1,CHUNK) # 存放數(shù)據(jù),用于繪制圖像,數(shù)據(jù)類型可為列表
# 定義畫布
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會不斷調(diào)用此函數(shù)刷新圖像,實現(xiàn)動態(tài)圖的效果)
def plot_update(i):
global data # data為全局變量
data_copy = data.copy() # 為避免線程不同步導(dǎo)致獲取到的data在繪制圖像時被更新,這里復(fù)制數(shù)據(jù)的副本,否則繪制圖像的時候可能會出現(xiàn)x和y的數(shù)據(jù)維度不相等的情況
x_data=np.arange(0,data_copy.shape[0],1) # x軸根據(jù)y軸數(shù)據(jù)自動生成(可根據(jù)需要修改)
ax.set_xlim(0,data_copy.shape[0]) # 橫坐標范圍(橫坐標的范圍和刻度可根據(jù)數(shù)據(jù)長度更新)
ax.set_title("title",fontsize=8) # 設(shè)置title
line.set_xdata(x_data) # 更新直線的數(shù)據(jù)
line.set_ydata(data_copy) # 更新直線的數(shù)據(jù)
# 大標題(若有多個子圖,可為其設(shè)置大標題)
plt.suptitle('Suptitle',fontsize=8)
# 重新渲染子圖
ax.figure.canvas.draw() # 必須加入這一行代碼,才能更新title和坐標!!!
return line, # 必須加逗號,否則會報錯(TypeError: 'Line2D' object is not iterable)
# 繪制動態(tài)圖
ani = animation.FuncAnimation(fig, # 畫布
plot_update, # 圖像更新
init_func=plot_init, # 圖像初始化
frames=1,
interval=30, # 圖像更新間隔
blit=True)
# 數(shù)據(jù)更新函數(shù)
def dataUpdate_thead():
global data
# 為了方便理解代碼,這里生成正態(tài)分布的隨機數(shù)據(jù)
while True: # 為了方便測試,讓數(shù)據(jù)不停的更新
data=np.random.normal(0,1,CHUNK)
# 為數(shù)據(jù)更新函數(shù)單獨創(chuàng)建一個線程,與圖像繪制的線程并發(fā)執(zhí)行
ad_rdy_ev = threading.Event()
ad_rdy_ev.set() # 設(shè)置線程運行
t = threading.Thread(target=dataUpdate_thead, args=()) # 更新數(shù)據(jù),參數(shù)說明:target是線程需要執(zhí)行的函數(shù),args是傳遞給函數(shù)的參數(shù))
t.daemon = True
t.start() # 線程執(zhí)行
plt.show() # 顯示圖像(0,1,CHUNK)
# 為數(shù)據(jù)更新函數(shù)單獨創(chuàng)建一個線程,與圖像繪制的線程并發(fā)執(zhí)行
ad_rdy_ev = threading.Event()
ad_rdy_ev.set() # 設(shè)置線程運行
t = threading.Thread(target=dataUpdate_thead, args=()) # 更新數(shù)據(jù),參數(shù)說明:target是線程需要執(zhí)行的函數(shù),args是傳遞給函數(shù)的參數(shù))
t.daemon = True
t.start() # 線程執(zhí)行
plt.show() # 顯示圖像
效果:

到此這篇關(guān)于python多線程實現(xiàn)動態(tài)圖繪制的文章就介紹到這了,更多相關(guān)python繪制動態(tài)圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 開發(fā)工具PyCharm安裝教程圖文詳解(新手必看)
PyCharm是一種Python IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,比如調(diào)試、語法高亮、Project管理、代碼跳轉(zhuǎn)、智能提示、自動完成、單元測試、版本控制。今天通過本文給大家分享PyCharm安裝教程,一起看看吧2020-02-02
手把手教你用Python中的Linting提高代碼質(zhì)量
Python是一種不斷發(fā)展的語言,隨著它的演化和擴展,可用工具和開發(fā)策略的數(shù)量也在增加,近來流行的一個過程是linting—檢查代碼的潛在問題,下面這篇文章主要給大家介紹了關(guān)于用Python中Linting提高代碼質(zhì)量的相關(guān)資料,需要的朋友可以參考下2023-01-01
Python下的Softmax回歸函數(shù)的實現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄狿ython下的Softmax回歸函數(shù)的實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
Numpy之random函數(shù)使用學(xué)習(xí)
這篇文章主要介紹了Numpy之random使用學(xué)習(xí),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
Python的Bottle框架中返回靜態(tài)文件和JSON對象的方法
這篇文章主要介紹了Python的Bottle框架中返回靜態(tài)文件和JSON對象的方法,Bottle框架在Python開發(fā)者中具有很高的人氣,需要的朋友可以參考下2015-04-04
Pytorch使用VGG16模型進行預(yù)測貓狗二分類實戰(zhàn)
VGG16是Visual Geometry Group的縮寫,它的名字來源于提出該網(wǎng)絡(luò)的實驗室,本文我們將使用PyTorch來實現(xiàn)VGG16網(wǎng)絡(luò),用于貓狗預(yù)測的二分類任務(wù),我們將對VGG16的網(wǎng)絡(luò)結(jié)構(gòu)進行適當?shù)男薷?以適應(yīng)我們的任務(wù),需要的朋友可以參考下2023-08-08

