欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何利用Matplotlib庫(kù)繪制動(dòng)畫(huà)及保存GIF圖片

 更新時(shí)間:2021年06月07日 08:54:55   作者:frank909  
這篇文章主要給大家介紹了關(guān)于如何利用Matplotlib庫(kù)繪制動(dòng)畫(huà)及保存GIF圖片的相關(guān)資料,matplotlib模塊提供了很高級(jí)和非常友好的使用方式,使用起來(lái)也是非常方便的,需要的朋友可以參考下

前言

在自學(xué)機(jī)器學(xué)習(xí)或者是深度學(xué)習(xí)的過(guò)程中,有的時(shí)候總想把執(zhí)行過(guò)程或者執(zhí)行結(jié)果顯示出來(lái),所以就想到了動(dòng)畫(huà)。好在用 Python 實(shí)現(xiàn)動(dòng)畫(huà)有許多中方式,而大家熟知的 Matplotlib 庫(kù)就可以實(shí)現(xiàn)。

本文的目的是對(duì) Matplotlib 的動(dòng)畫(huà)實(shí)現(xiàn)手段做一個(gè)簡(jiǎn)單的說(shuō)明。

繪制動(dòng)畫(huà)

import matplotlib.pyplot as plt
import matplotlib.animation as animation

如果要讓 matplotlib 實(shí)現(xiàn)動(dòng)畫(huà)功能的話,那么就要引入 animation 模塊。

然后再創(chuàng)建 animation 的對(duì)象。

anim = animation.FuncAnimation(fig, run, data_gen, blit=False, interval=10,
                              repeat=False, init_func=init)

animation 的實(shí)現(xiàn)類是 FuncAnimation,它有一個(gè)構(gòu)造方法。下面先通過(guò)一個(gè)示例,講解 animation 的基本用法,然后再來(lái)細(xì)致分析 FuncAnimation 構(gòu)造方法中各項(xiàng)參數(shù)的意義。

我們的目標(biāo)是做一個(gè) Sin 函數(shù)的動(dòng)畫(huà)示例。

代碼很簡(jiǎn)單。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro',animated=True)

def init():
    ax.set_xlim(-np.pi,np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 90),interval=10,
                    init_func=init,blit=True)
plt.show()

核心代碼是這一行。

anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 90),interval=10,
                    init_func=init,blit=True)

按照上面的示例代碼,我們可以依葫蘆畫(huà)瓢編寫(xiě)動(dòng)畫(huà)代碼了。

但,如果我們需要達(dá)到靈活運(yùn)用的話,就需要花點(diǎn)心思,了解它們的機(jī)制。

我們先來(lái)看看 FuncAnimation 的構(gòu)造方法。

def __init__(self, fig, func, frames=None, init_func=None, fargs=None,
                 save_count=None, **kwargs):

fig 自然是 matplotlib 中的 figure 對(duì)象。

func 是每一次更新時(shí)所調(diào)用的方法,它是回調(diào)函數(shù)。因此,我們可以在這個(gè)方法中更新 figure 當(dāng)中的 axes 中的 line2d 對(duì)象,它是動(dòng)態(tài)更新 figure 的根本。

frames 代表了整個(gè)動(dòng)畫(huà)過(guò)程中幀的取值范圍,而本質(zhì)上是一個(gè)數(shù)據(jù)發(fā)生器。我將在后面重點(diǎn)講解它。

init_func 是初始函數(shù),用來(lái)初始 figure 的畫(huà)面。

fargs 是每次附加給 func 回調(diào)函數(shù)的參數(shù),可以為 None

save_count 是緩存的數(shù)量

除此之外,還有一些可選的參數(shù),它們分別是

interval 是每 2 個(gè) frame 發(fā)生的時(shí)間間隔,單位是 ms,默認(rèn)值是 200.

repeat_delay 取值是數(shù)值,如果 animation 是重復(fù)播放的話,這個(gè)值就是每次播放之間的延遲時(shí)間,單位是 ms。

repeat bool 型可選參數(shù),默認(rèn)為 True,代表動(dòng)畫(huà)是否會(huì)重復(fù)執(zhí)行

blit bool 型可選參數(shù),控制繪制的優(yōu)化。默認(rèn)是 False。

如何理解 animation 呢?

我認(rèn)為,animation 的核心是 frames 和 func。

frames 可以取值:iterable,int,generator 生成器函數(shù) 或者是 None。

在上面的代碼中,我們給 frames 的取值是這樣的。

frames=np.linspace(-np.pi,np.pi, 90)

其實(shí)就是一個(gè) list,它的值范圍為 -pi 到 pi,frames 總共有 90 幀,而 list 是一個(gè) iterable 類型,所以它可以不停的迭代。

frames 也可以取值為整數(shù),相當(dāng)于給參數(shù)賦值 range(frames)。

frames 也可以取值為 None,那么它的結(jié)果相當(dāng)于傳遞 itertools.count,結(jié)構(gòu)就是從 0 開(kāi)始,每次步進(jìn) 1,無(wú)限的執(zhí)行下去。

frames 還接受 generator 函數(shù),也就是生成器,但有個(gè)前提是,生成器要符合下面的簽名格式。

def gen_function() -> obj

參數(shù)列表為空,但需要返回一個(gè)值,這個(gè)值就會(huì)傳入到 func 回調(diào)函數(shù)當(dāng)中。

func 是回調(diào)函數(shù),它會(huì)在每次更新的時(shí)候被調(diào)用,所以我們只需要在這個(gè)函數(shù)中更新 figure 中的數(shù)值就可以了,就像下面代碼。

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

frames 和 func 的關(guān)系是什么?

實(shí)際上,frames 決定了整個(gè)動(dòng)畫(huà) frame 的取值范圍,它會(huì)在 interval 時(shí)間內(nèi)迭代一次,然后將值傳遞給 func,直到整個(gè) frames 迭代完畢。

我本人而言,也更傾向于用 generator 函數(shù)去定義 frames 而不是直接分配一個(gè)列表,所以我可以將之前的代碼改寫(xiě)如下。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro',animated=True)

def init():
    ax.set_xlim(-np.pi,np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

def data_gen():

    frame = -np.pi

    step = 2 * np.pi / 90

    while frame < np.pi:
        frame += step
        yield frame

# anim = animation.FuncAnimation(fig, update, frames=np.linspace(-np.pi,np.pi, 360),interval=10,
#                     init_func=init,blit=True)
anim = animation.FuncAnimation(fig, update, frames=data_gen,interval=10,
                    init_func=init,blit=True)

plt.show()

data_gen 就是一個(gè)生成器函數(shù),它會(huì)每隔 10ms 運(yùn)行一次,然后將結(jié)果傳遞給 update 函數(shù)。

data_gen 里面運(yùn)用到了 yield 關(guān)鍵字,這是的我們可以在每次迭代時(shí)才返回相應(yīng)的結(jié)構(gòu),而不要在一開(kāi)始就分配。如果不熟悉這方面知識(shí)點(diǎn)的同學(xué),可以自行搜索相應(yīng)的知識(shí)。

保存動(dòng)畫(huà)

因?yàn)榻?jīng)常寫(xiě)博客,所以也經(jīng)常需要將結(jié)果保存下來(lái),一般我會(huì)保存為 .gif 格式圖片,本篇博文的 gif 圖像就是通過(guò) matplotlib 保存的。

好在用 matplotlib 實(shí)現(xiàn)它也并不難。

anim.save('test_animation.gif',writer='imagemagick')

一句代碼就搞定了,運(yùn)行成功后,會(huì)在當(dāng)前目錄下生成 test_animation.gif 圖像。

需要注意到的是,如果要保存 gif 圖像,這要求開(kāi)發(fā)者電腦已經(jīng)安裝了 ImageMagicK。

ubuntu 用戶可以通過(guò)如下命令安裝。

sudo apt-get install imagemagick

并且,動(dòng)畫(huà)保存的時(shí)候要指定 writer 為 imagemagick.

動(dòng)畫(huà)可以保存為 gif 圖像,自然也能保存為 mp4 視頻格式。

但這要求開(kāi)發(fā)者計(jì)算機(jī)已經(jīng)安裝好 ffmpeg 庫(kù),并且 save 方法中指定 writer 為 ffmpeg,具體細(xì)節(jié)請(qǐng)讀者自行擴(kuò)展閱讀。

總結(jié)

到此這篇關(guān)于如何利用Matplotlib庫(kù)繪制動(dòng)畫(huà)及保存GIF圖片的文章就介紹到這了,更多相關(guān)Matplotlib庫(kù)繪制動(dòng)畫(huà)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)微信表情包炸群功能

    Python實(shí)現(xiàn)微信表情包炸群功能

    這篇文章主要介紹了Python實(shí)現(xiàn)微信表情包炸群功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Python圖像處理庫(kù)PIL的ImageEnhance模塊使用介紹

    Python圖像處理庫(kù)PIL的ImageEnhance模塊使用介紹

    這篇文章主要介紹了Python圖像處理庫(kù)PIL的ImageEnhance模塊使用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python實(shí)現(xiàn)Excel做表自動(dòng)化的最全方法合集

    Python實(shí)現(xiàn)Excel做表自動(dòng)化的最全方法合集

    Microsoft?Excel?是一款強(qiáng)大的辦公工具,廣泛用于數(shù)據(jù)分析、報(bào)告制作、預(yù)算管理等各種任務(wù),本文將深入探討如何使用?Python?進(jìn)行?Excel?表格的自動(dòng)化,需要的可以參考下
    2024-02-02
  • Python 第三方日志框架loguru使用

    Python 第三方日志框架loguru使用

    使用Python自帶的logging模塊記錄日志,但是總覺(jué)得不夠優(yōu)雅。 Loguru解決了這個(gè)問(wèn)題,接下來(lái)通過(guò)本文給大家介紹Python 第三方日志框架loguru使用,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Python pandas 重命名索引和列名稱的實(shí)現(xiàn)

    Python pandas 重命名索引和列名稱的實(shí)現(xiàn)

    本文主要介紹了Python pandas 重命名索引和列名稱的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 淺談Python中進(jìn)程的創(chuàng)建與結(jié)束

    淺談Python中進(jìn)程的創(chuàng)建與結(jié)束

    這篇文章主要介紹了淺談Python中進(jìn)程的創(chuàng)建與結(jié)束,但凡是硬件,都需要有操作系統(tǒng)去管理,只要有操作系統(tǒng),就有進(jìn)程的概念,就需要有創(chuàng)建進(jìn)程的方式,需要的朋友可以參考下
    2023-07-07
  • 如何利用python腳本自動(dòng)部署k8s

    如何利用python腳本自動(dòng)部署k8s

    這篇文章主要介紹了利用python腳本自動(dòng)部署k8s的方法,本文通過(guò)腳本代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 如何用Python獲取計(jì)算機(jī)名,ip地址,mac地址

    如何用Python獲取計(jì)算機(jī)名,ip地址,mac地址

    這篇文章主要介紹了如何用Python獲取計(jì)算機(jī)名,ip地址,mac地址,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文)

    Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文)

    這篇文章主要介紹了Anaconda3+tensorflow2.0.0+PyCharm安裝與環(huán)境搭建(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python實(shí)現(xiàn)的微信紅包提醒功能示例

    Python實(shí)現(xiàn)的微信紅包提醒功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的微信紅包提醒功能,結(jié)合實(shí)例形式分析了Python使用微信模塊itchat實(shí)現(xiàn)微信紅包提醒操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-08-08

最新評(píng)論