您好,登錄后才能下訂單哦!
今天小編給大家分享一下python多線程怎么實現動態圖繪制的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
有些情況下,我們面對實時更新的數據,希望能夠在一個窗口中可視化出來,并且能夠實時更新,方便我們觀察數據的變化,從而進行數據分析,例如:繪制音頻的波形,繪制動態曲線等,下面介紹使用matplotlib結合多線程繪制動態圖,希望能幫助到有需要的朋友。
遇到的場景:最近剛好在學習人工智能中的遺傳算法,并且使用該算法求解TSP,了解這個算法的朋友知道這個算法是通過不斷迭代,尋找適應度大的最優解,為了了解迭代過程中適應度的變化,我希望能夠實時更新迭代過程中的適應度,將其可視化出來(數據量不斷增大)
工具:matplotlib.animation
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多線程怎么實現動態圖繪制”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。