Matplotlib繪圖基礎(chǔ)之動(dòng)畫(huà)繪制詳解
matplotlib
的動(dòng)畫(huà)一直是一個(gè)強(qiáng)大但使用頻率不高的功能,究其原因,一方面展示動(dòng)畫(huà)需要一定的媒介,沒(méi)有圖形和文字展示方便;二來(lái)大家更關(guān)心的是分析結(jié)果的最終圖表,圖表的動(dòng)態(tài)展示則沒(méi)有那么重要。
不過(guò),隨著短視頻的興起,在短視頻平臺(tái)上展示動(dòng)畫(huà)變得非常容易,所以,我們發(fā)現(xiàn)有越來(lái)越多的數(shù)據(jù)分析動(dòng)畫(huà)(比如各種橫向條形圖的排名等等)出現(xiàn)在了短視頻平臺(tái)上。
通過(guò)動(dòng)畫(huà)來(lái)展示數(shù)據(jù)和模型的變化過(guò)程,可使數(shù)據(jù)的可視化更加生動(dòng)形象,隨著各種平臺(tái)的興起,matplotlib
的動(dòng)畫(huà)功能也因此有了更多的用武之地。
1. 動(dòng)畫(huà)示例
介紹matplotlib
的動(dòng)畫(huà)功能之前,先看用matplotlib
制作的兩個(gè)簡(jiǎn)單的的動(dòng)畫(huà)示例。
1.1. 單個(gè)動(dòng)畫(huà)
首先是單個(gè)動(dòng)畫(huà),繪制一個(gè)正弦曲線。
import numpy as np import matplotlib import matplotlib.pyplot as plt import matplotlib.animation as animation x = np.linspace(-8, 8, 100) y = np.sin(x) fig, ax = plt.subplots() (g,) = ax.plot(x, y) def update(frame): y = np.sin(x[:frame]) g.set_data(x[:frame], y) animation.FuncAnimation(fig, update, interval=50, frames=len(x))
1.2. 組合動(dòng)畫(huà)
除了單個(gè)動(dòng)畫(huà)之外,組合動(dòng)畫(huà)也簡(jiǎn)單,下面的示例中,先繪制一個(gè)正弦曲線,然后一個(gè)點(diǎn)沿著曲線運(yùn)動(dòng),隨著這個(gè)點(diǎn),繪制正弦曲線的切線。
x = np.linspace(-8, 8, 100) f = lambda x: np.sin(x / 2) fig, ax = plt.subplots() fig.set_size_inches(8, 4) ax.plot(x, f(x), 'lightblue') (point,) = ax.plot(x[0], f(x[0]), "r", alpha=0.4, marker="o") (line,) = ax.plot([0], [0], "g", linewidth=3) #繪制切線 def tangent_line(x0, y0): h = 1e-4 num_min = f(x0 - h) num_max = f(x0 + h) k = (num_max - num_min) / (2 * h) xs = np.linspace(x0 - 0.5, x0 + 0.5, 100) ys = y0 + k * (xs - x0) return xs, ys #移動(dòng)切點(diǎn) def move_point(frame): point.set_data([x[frame]], [f(x[frame])]) xs, ys = tangent_line(x[frame], f(x[frame])) line.set_data(xs, ys) animation.FuncAnimation(fig, move_point, interval=50, frames=len(x))
2. 動(dòng)畫(huà)函數(shù)
matplotlib
的動(dòng)畫(huà)函數(shù)主要有兩種,它們的動(dòng)畫(huà)原理差別很大,了解它們之間的區(qū)別,才能根據(jù)自己的場(chǎng)景選擇合適的動(dòng)畫(huà)函數(shù)。
2.1. FuncAnimation
上一節(jié)的示例中使用的就是FuncAnimation
,它的動(dòng)畫(huà)原理是通過(guò)回調(diào)函數(shù),不斷重繪圖形,已達(dá)到動(dòng)畫(huà)的效果。
主要的參數(shù)有:
- 畫(huà)布:比如上面第一個(gè)示例中的
fig
- 回調(diào)函數(shù):比如上面第一個(gè)示例中的
update
- 調(diào)用回調(diào)函數(shù)的間隔:比如上面第一個(gè)示例中的
interval=50
,單位是毫秒 - 調(diào)用回調(diào)函數(shù)的次數(shù):比如上面第一個(gè)示例中的
frames=len(x)
簡(jiǎn)單來(lái)說(shuō),也就是FuncAnimation
函數(shù)每隔interval
毫秒,調(diào)用一次update
,一共調(diào)用frames
次。
2.2. ArtistAnimation
ArtistAnimation
函數(shù)的原理則是先準(zhǔn)備好每一幀的數(shù)據(jù),然后繪制按照一定的時(shí)間間隔,繪制每一幀數(shù)據(jù)對(duì)應(yīng)的圖像。
比如上面的示例一樣的正弦曲線,用ArtistAnimation
函數(shù)繪制的話:
points = np.linspace(-8, 8, 100) fig, ax = plt.subplots() frames = [] for i in range(50): x = points[:i] y = np.sin(x) g = ax.plot(x, y) frames.append(g) animation.ArtistAnimation(fig, frames, interval=50)
ArtistAnimation
的主要參數(shù):
- 畫(huà)布:比如上面示例中的
fig
- 每一幀的數(shù)據(jù):比如上面示例中的
frames
- 每一幀的間隔:比如上面示例中的
interval=50
,單位是毫秒
ArtistAnimation
沒(méi)有回調(diào)函數(shù),只要準(zhǔn)備好每一幀的數(shù)據(jù),它會(huì)按照時(shí)間間隔繪制每一幀的數(shù)據(jù)。
3. 動(dòng)畫(huà)導(dǎo)出
最后,是動(dòng)畫(huà)的導(dǎo)出,常用的兩種格式是MP4
和GIF
。
如果安裝了 ffmpeg
,那么導(dǎo)出這兩種格式就很簡(jiǎn)單了。
3.1. 導(dǎo)出mp4
#前面部分省略。。。 anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x)) anim.save("./output.mp4", writer='ffmpeg')
導(dǎo)出的文件名后綴 mp4
,則可以導(dǎo)出視頻。
這里的writer
參數(shù)用ffmpeg
。
3.2. 導(dǎo)出GIF
同樣,導(dǎo)出gif
也一樣,文件名的后綴 gif
即可。
#前面部分省略。。。 anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x)) anim.save("./output.gif", writer='ffmpeg')
當(dāng)然,也可以不用ffmpeg
,比如,如果安裝了imagemagick
,這里的writer
也可以用imagemagick
。
#前面部分省略。。。 anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x)) anim.save("./output.gif", writer='imagemagick')
以上就是Matplotlib繪圖基礎(chǔ)之動(dòng)畫(huà)繪制詳解的詳細(xì)內(nèi)容,更多關(guān)于Matplotlib動(dòng)畫(huà)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用Python實(shí)現(xiàn)web端用戶(hù)登錄和注冊(cè)功能的教程
這篇文章主要介紹了用Python實(shí)現(xiàn)web端用戶(hù)登錄和注冊(cè)功能的教程,需要的朋友可以參考下2015-04-04利用Python+PyQt5實(shí)現(xiàn)簡(jiǎn)易瀏覽器的實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于如何利用Python+PyQt5實(shí)現(xiàn)簡(jiǎn)易瀏覽器的相關(guān)資料,Qt 的主要優(yōu)勢(shì)是可以開(kāi)發(fā)跨平臺(tái)的圖形界面程序,基于 Qt 的應(yīng)用能夠借助于各平臺(tái)的原生性在不同類(lèi)的設(shè)備上運(yùn)行,而無(wú)須修改任何代碼庫(kù),需要的朋友可以參考下2021-07-07pycharm遠(yuǎn)程連接服務(wù)器運(yùn)行pytorch的過(guò)程詳解
這篇文章主要介紹了在Linux環(huán)境下使用Anaconda管理不同版本的Python環(huán)境,并通過(guò)PyCharm遠(yuǎn)程連接服務(wù)器來(lái)運(yùn)行PyTorch的過(guò)程,包括安裝PyTorch、CUDA以及配置PyCharm遠(yuǎn)程開(kāi)發(fā)環(huán)境的詳細(xì)步驟,需要的朋友可以參考下2025-02-02Python批量解壓文件中出現(xiàn)中文亂碼的原因及解決方法
這篇文章主要給大家記一次Python批量解壓文件遇中文亂碼及解決過(guò)程,文中有詳細(xì)的圖解及代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08關(guān)于PyTorch中nn.Module類(lèi)的簡(jiǎn)介
這篇文章主要介紹了關(guān)于PyTorch中nn.Module類(lèi)的簡(jiǎn)介,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02