首頁 > 軟體

python多執行緒實現動態圖繪製

2022-04-15 16:00:02

一、背景

有些情況下,我們面對實時更新的資料,希望能夠在一個視窗中視覺化出來,並且能夠實時更新,方便我們觀察資料的變化,從而進行資料分析,例如:繪製音訊的波形,繪製動態曲線等,下面介紹使用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() # 顯示影象

效果:

到此這篇關於python多執行緒實現動態圖繪製的文章就介紹到這了,更多相關python繪製動態圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com