奢侈品商城網(wǎng)站建設(shè)方案泰安做網(wǎng)站公司
Python庫matplotlib之六
- 動畫
- FuncAnimation
- 構(gòu)造器
- 成員函數(shù)
- 應(yīng)用例子
動畫
Matplotlib基于其繪圖功能,還提供了一個使用動畫模塊,生成動畫的接口。動畫是一系列幀,其中每個幀對應(yīng)于圖形上的一個圖。
Matplotlib使用兩個類來實(shí)現(xiàn)動畫, 它們分別是
- FuncAnimation:生成第一幀的數(shù)據(jù),然后修改每一幀的數(shù)據(jù)以創(chuàng)建動畫圖。這個類在速度和內(nèi)存方面更加高效,因?yàn)樗L制一次artist,然后對其進(jìn)行修改
- ArtistAnimation:生成將在動畫中的每個幀中進(jìn)行繪制的artist列表(可迭代)。這個類很靈活,因?yàn)樗试S任何可迭代的artist按序列進(jìn)行動畫處理。
FuncAnimation
構(gòu)造器
詞法:matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
FuncAnimation是TimedAnimation的子類,它通過重復(fù)調(diào)用函數(shù)func來制作動畫。
參數(shù)說明
-
fig,該參數(shù)類型是Figure
fig是一個Figure對象,用于獲取所需事件,例如繪制或調(diào)整大小。 -
func,該參數(shù)類型是callable
func參數(shù)是一個函數(shù),每一幀都需要調(diào)用該函數(shù)。該函數(shù)的第一個參數(shù)將是frames參數(shù)的下一個值。任何其他位置參數(shù),都可以使用 functools.partial 或通過 fargs 參數(shù)提供。def func(frame, *fargs) -> iterable_of_artists
使用 functools.partial 提供參數(shù)通常更方便。通過這種方式,也可以傳遞關(guān)鍵字參數(shù)。要傳遞具有位置參數(shù)和關(guān)鍵字參數(shù)的函數(shù),將所有參數(shù)設(shè)置為關(guān)鍵字參數(shù),只需保留frame參數(shù)未設(shè)置:
blit == True,則 func 必須返回所有已修改或創(chuàng)建的artists的可迭代對象。blitting算法使用此信息來確定必須更新圖形的哪些部分。
blit == False,則返回值不被使用,并且在這種情況下可以被省略。 -
frames,該參數(shù)類型是iterable, int, generator函數(shù), 或None, 是可選的
frames是傳遞給函數(shù)func的數(shù)據(jù)源,動畫每一幀數(shù)據(jù)
如果frames是iterable,則只需使用提供的值即可。如果 iterable 有長度,它將蓋寫save_count kwarg。
如果frames是整數(shù),則相當(dāng)于傳遞range(frames)
如果frames是生成器函數(shù),則必須具有下列形式:def gen_function() -> obj
如果frames是None,則相當(dāng)于傳遞 itertools.count。
在所有參數(shù)類型情況下,frames中的值只是簡單地傳遞給用戶提供的函數(shù),因此可以是任何類型。 -
init_func,該參數(shù)類型是callable, 是可選的
init_func是用于繪制清晰框架的函數(shù)。如果未給出,則將使用幀序列中第一項(xiàng)的繪制結(jié)果。該函數(shù)將在第一幀之前調(diào)用一次。該函數(shù)具有下列形式def init_func() -> iterable_of_artists
blit == True,則 init_func 必須返回要重新繪制的artists的可迭代對象。blitting算法使用此信息來確定必須更新圖形的哪些部分。
blit == False,則返回值不被使用,并且在這種情況下可以被省略。 -
fargs,該參數(shù)類型是tuple,或None, 是可選的
參數(shù)fargs是每次調(diào)用 func 的附加參數(shù)。使用functools.partial更好。 -
save_count,該參數(shù)類型是int, 是可選的
從frames到緩存的值的數(shù)量。僅當(dāng)無法從frames推斷出幀數(shù)量時,才使用此方法,即當(dāng)它是沒有長度的迭代器或生成器時。 -
interval,該參數(shù)類型是int, 默認(rèn)值為200
幀之間以毫秒為單位的延遲。 -
repeat_delay,該參數(shù)類型是int, 默認(rèn)值為0
如果參數(shù)repeat為 True,則該參數(shù)是連續(xù)動畫運(yùn)行之間以毫秒為單位的延遲。 -
repeat,該參數(shù)類型是bool, 默認(rèn)值為True
該參數(shù)確定,當(dāng)幀序列完成時,是否重復(fù)動畫。 -
blit,該參數(shù)類型是bool, 默認(rèn)值為False
blit確定是否使用位塊傳輸來優(yōu)化繪圖。使用 blitting 時,任何動畫artists都將根據(jù)其 zorder 進(jìn)行繪制;然而,無論他們的zorder如何,他們都會被繪制在任何以前的artists之上。 -
cache_frame_data,該參數(shù)類型是bool, 默認(rèn)值為True
cache_frame_data確定是否緩存幀數(shù)據(jù)。當(dāng)幀包含大型對象時,禁用緩存可能會有所幫助。
成員函數(shù)
成員函數(shù) | 說明 |
---|---|
_init_ (fig, func[, frames, init_func, …]) | |
new_frame_seq() | 返回新的幀信息序列。 |
new_saved_frame_seq() | 返回已保存/緩存的幀信息的新序列。 |
pause() | 暫停動畫。 |
resume() | 恢復(fù)動畫。 |
save(filename[, writer, fps, dpi, codec, …]) | 通過繪制每一幀,將動畫保存為電影文件。 |
to_html5_video([embed_limit]) | 將動畫轉(zhuǎn)換為 HTML5 <video> 標(biāo)記。 |
to_jshtml([fps, embed_frames, default_mode]) | 生成動畫的 HTML 表示形式。 |
應(yīng)用例子
這個例子是一個拋物線演示動畫,通過不斷調(diào)用函數(shù)update,演示不同的幀。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as npdef update(frame):global t, z, scat, line2if frame < 39:print("frame: {0}".format(frame), end=",")else:print("frame: {0}".format(frame))# for each frame, update the data stored on each artist.x = t[:frame]y = z[:frame]# update the scatter plot:data = np.stack([x, y]).Tscat.set_offsets(data)# update the line plot:line2.set_xdata(t[:frame])line2.set_ydata(z2[:frame])return (scat, line2)if __name__ == "__main__":global t, z, scat, line2fig, ax = plt.subplots()t = np.linspace(0, 3, 40)g = -9.81v0 = 12z = g * t**2 / 2 + v0 * tv02 = 5z2 = g * t**2 / 2 + v02 * tscat = ax.scatter(t[0], z[0], c="r", s=5, label=f'v0 = {v0} m/s')line2 = ax.plot(t[0], z2[0], label=f'v0 = {v02} m/s')[0]ax.set(xlim=[0, 3], ylim=[-4, 8], xlabel='Time [s]', ylabel='Z [m]')ax.legend()ani = animation.FuncAnimation(fig=fig, func=update, frames=40, interval=30, repeat=False)plt.show()
上述程序運(yùn)行產(chǎn)生的屏幕輸出
C:\>python animation_1.py
frame: 0,frame: 0,frame: 1,frame: 2,frame: 3,frame: 4,frame: 5,frame: 6,frame: 7,frame: 8,frame: 9,frame: 10,frame: 11,frame: 12,frame: 13,frame: 14,frame: 15,frame: 16,frame: 17,frame: 18,frame: 19,frame: 20,frame: 21,frame: 22,frame: 23,frame: 24,frame: 25,frame: 26,frame: 27,frame: 28,frame: 29,frame: 30,frame: 31,frame: 32,frame: 33,frame: 34,frame: 35,frame: 36,frame: 37,frame: 38,frame: 39