Hello~ Internet!
這個系列進入尾聲了~ 來到了第六篇! 在這一篇我們來讓 Matplotlib 變成動畫吧!
這次的UI介面檔案我一樣推薦直接去 github 下載喔!
我會直接從動畫部分開始介紹!
如果還沒看得之前 UI 設計與分離的文章的話,可以點這裡看上一篇介紹喔!
或是想先了解怎麼把 Matplotlib 嵌入 PyQt5 中的話推薦先去理解後再來看這篇喔!
這一篇我們來加入Matplotlib Animation吧!
這篇會介紹到:
- Matplotlib 真正的 Animation
- PyQt5 中的 Animation
Matplotlib 真正的 Animation
為什麼會說真正的 Animation 呢?
因為 PyQt5 的機制 ( 我目前研究的發現,踩到很大的雷QQ )
它會禁止 Matplotlib 的原生動畫
但是為了保持高品質的部落格,我想我還是一定要介紹一下 真正的 Animation 才行呢!!
這一段我想我就直接給大家看吧!
import numpy as np from matplotlib import pyplot as plt from matplotlib import animation fig = plt.figure() ax = plt.axes(xlim=(0, 2), ylim=(-2, 2)) line, = ax.plot([], [], lw=2) def init(): line.set_data([], []) return line, def animate(i): x = np.linspace(0, 2, 1000) y = np.sin(2 * np.pi * (x - 0.01 * i)) line.set_data(x, y) return line, anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=1, blit=True) plt.show()
跟一般的圖表設定方法一模一樣,設定 fig、設定 ax 等等
對了!不要以為 line 後面的逗號是多打的喔!
因為 ax 的 plot 回傳會是一個陣列,而我們只有一張圖,所以就把它 Unpack 出來囉!
接者設定初始化的 function,和跑動畫時的更新 function
如果想要把影片存下來的話 可以像下面這樣寫喔!
這是可以存成 mp4 格式的參數設置。
anim.save('anim.mp4', fps=30, extra_args=['-vcodec', 'libx264'])
動畫完成的話會像下面這樣
PyQt5 中的 Animation
因為 PyQt5 會阻擋動畫的設置,所以只能用設定 Timer 的方式,所以我們需要使用到
QTimer
設定方法像下面這樣
設定 timeout 時 用哪個 function 更新狀態 還有設定 FRAME_PRE_SECOND(FPS) 來決定多久更新一次狀態
self.timer = QtCore.QTimer(self) self.timer.timeout.connect(self.update_AnimationData) self.timer.start(1000/self.FRAME_PER_SECOND)
我們需要將這三行程式碼包裝在一個可以呼叫的 function 裡面,接者在設定一個更新用的 function
def update_AnimationData(self): # 次數增加 self.updateTime = self.updateTime + 1 # 插入資料 self.X = np.linspace(self.updateTime, self.updateTime + 20, 100) self.Y = np.sin(self.X) # 繪圖 self.axes.set_xlim(self.updateTime, self.updateTime + 20) self.axes.plot(self.X, self.Y, "c") self.axes.set_xlabel("時間", fontproperties=self.zhfont1) self.axes.set_ylabel("震幅", fontproperties=self.zhfont1) self.axes.grid(True) self.draw()
很高興你提出了一個很好的問題!(有吧! 有發現吧!
突然出現了一個 self.updateTime 變數,這是幹嘛用的呀?
它的存在就是代表著現在動畫跑到了第幾個 frame!
利用第幾個 frame 也可以控制我們要跑數據的範圍喔!
最後,使用 QTimer 的動畫就完成了~
( 個人覺得動畫比較不流暢一點啦 )
當然~這次也是一樣的~
完整程式碼我都放在 gtihub 上給大家直接下載喔~
在這裡 github ep6
結尾:
已經要到尾聲了呀~
下一篇會把之前講到的所有功能合在一起,直接做成完整的程式喔!
盡請期待吧~
不知道大家覺得這樣的系列文好不好 在下面留言告訴我喔
或是有什麼其他的想法都可以告訴我喔~
(不敢公開留言的話可以用 聯絡我 寄信跟我說喔~
# 最近開學了… 希望這學期的鳥事沒有太多啊!!!!
那就先這樣啦!
我們下一篇見囉!
ㄅㄅ
感謝Hao大大
讚讚