發表於 PyQT5Python

【Python】PyQT5 Sin,Cos Matplotlib 動畫應用程式 -6 PyQt5 讓 Matplotlib 變動畫吧!Feat. QTimer

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'])

動畫完成的話會像下面這樣

Matplotlib Animation

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 的動畫就完成了~
( 個人覺得動畫比較不流暢一點啦 )

PyQt5 QTimer 動畫

當然~這次也是一樣的~
完整程式碼我都放在 gtihub 上給大家直接下載喔~
在這裡 github ep6


結尾:

已經要到尾聲了呀~
下一篇會把之前講到的所有功能合在一起,直接做成完整的程式喔!
盡請期待吧~

不知道大家覺得這樣的系列文好不好 在下面留言告訴我喔
或是有什麼其他的想法都可以告訴我喔~
(不敢公開留言的話可以用 聯絡我 寄信跟我說喔~

# 最近開學了… 希望這學期的鳥事沒有太多啊!!!!

那就先這樣啦!
我們下一篇見囉!

ㄅㄅ

作者:

一位 熱愛資工領域、喜歡好笑事物、偶爾打打網球 的學生 ! For A Better Me!

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.