【轉(zhuǎn)】如何用 Matplotlib 畫 GIF 動(dòng)圖

先占個(gè)位崖咨,以后解釋原理

如何用 Matplotlib 畫 GIF 動(dòng)圖

今天分享的這篇譯文中介紹了 matplotlib 繪圖庫的一個(gè) 使用示例荚醒,即如何制作 GIF 動(dòng)圖。本文原作者為 Eli Bendersky,譯者為 唐曉霆 Jason 嗅钻,由編程派 EarlGrey 校對(duì)屿储。

譯者簡(jiǎn)介:唐曉霆,在香港的成都人吠裆,城市大學(xué)研究助理伐谈,會(huì)寫python,興趣是深度學(xué)習(xí)试疙。

這篇短文介紹如何用 Python 里的 matplotlib 畫出 GIF 動(dòng)圖诵棵。下面的代碼我在一臺(tái)安裝了 ImagMagickUbuntu 機(jī)器上運(yùn)行過。 若想要用 matplotlibsave 方法渲染 GIF 動(dòng)圖的話祝旷,就必須安裝 ImageMagick 履澳。

下面給一個(gè)動(dòng)畫樣本:

有幾點(diǎn)需要注意:

  1. 圖里的散點(diǎn)部分是不變的;變的是直線
  2. X 軸的標(biāo)題每一幀都在變化

下面上制作該圖的代碼:

import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
fig.set_tight_layout(True)

#  詢問圖形在屏幕上的尺寸和DPI(每英寸點(diǎn)數(shù))怀跛。
#  注意當(dāng)我們把圖形儲(chǔ)存成一個(gè)文件時(shí)距贷,我們需要再另外提供一個(gè)DPI值
print('fig size: {0} DPI, size in inches {1}'.format(
    fig.get_dpi(), fig.get_size_inches()))

# 畫出一個(gè)維持不變(不會(huì)被重畫)的散點(diǎn)圖和一開始的那條直線。
x = np.arange(0, 20, 0.1)
ax.scatter(x, x + np.random.normal(0, 3.0, len(x)))
line, = ax.plot(x, x - 5, 'r-', linewidth=2)

def update(i):
    label = 'timestep {0}'.format(i)
    print(label)
    # 更新直線和x軸(用一個(gè)新的x軸的標(biāo)簽)吻谋。
    # 用元組(Tuple)的形式返回在這一幀要被重新繪圖的物體
    line.set_ydata(x - 5 + i)
    ax.set_xlabel(label)
    return line, ax

if __name__ == '__main__':
    # FuncAnimation 會(huì)在每一幀都調(diào)用“update” 函數(shù)忠蝗。
    # 在這里設(shè)置一個(gè)10幀的動(dòng)畫,每幀之間間隔200毫秒
    anim = FuncAnimation(fig, update, frames=np.arange(0, 10), interval=200)
    if len(sys.argv) > 1 and sys.argv[1] == 'save':
        anim.save('line.gif', dpi=80, writer='imagemagick')
    else:
        # plt.show() 會(huì)一直循環(huán)播放動(dòng)畫
        plt.show()

如果你想換一個(gè)更精美的主題漓拾,安裝 seaborn 庫之后添加一行:

import seaborn

然后你就會(huì)得到這個(gè)圖:

提一句關(guān)于文件大小的警告:雖然我在這里分享的 GIF只有 10 幀阁最,而且圖像也很簡(jiǎn)單戒祠,但是它們每一幀都占大約 160K 。就我理解而言速种,GIF 動(dòng)圖不使用跨幀壓縮姜盈, 所以這使得長(zhǎng)一點(diǎn)的 GIF 占的空間異常大。減少幀數(shù)到最最小并且讓每一幀的圖像小一點(diǎn)(通過在 matplotlib 里調(diào)整圖形尺寸或者 DPI )哟旗,就可以多多少少幫助緩解一下這個(gè)問題贩据。

EarlGrey:我自己測(cè)試生成的 line.gif 文件大概 86 KB 左右。

點(diǎn)擊查看原文鏈接

說明

我將源碼測(cè)試過闸餐,但是在彈出框中的保存沒有保存為 gif饱亮。另外,按照代碼中的說明舍沙,這樣操作是可以保存為gif

python test.py save

但是之前作者說過近上,需要安裝ImagMagick,這個(gè)不是python的包拂铡,是依賴于php的一個(gè)工具壹无,具體安裝步驟可以見這里【windows下的ImageMagick安裝詳細(xì)過程】,感覺有點(diǎn)麻煩感帅,其實(shí)也可以下載一個(gè)錄屏的軟件斗锭,然后制作為gif就好啦!

另外來自于知乎的 - 【如何用Python實(shí)現(xiàn)動(dòng)態(tài)圖失球? - 帶蘿卜的回答】

import matplotlib.pyplot as plt
import time

def insert_sort(lst):
    lsts = []
    for i in range(len(lst)):
        temp = lst[i]
        j = i-1
        while j>=0 and lst[j]>temp:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = temp
        l = lst[:]
        lsts.append(l)
    return lsts


if __name__ == "__main__":
    lst = [13,32,42,1,53,4,66,2,5,7,74,23]
    lsts = insert_sort(lst)
    plt.ion()#打開交互模式
    fig = plt.figure()#新建繪圖窗口
    ax  = plt.gca()#獲取當(dāng)前子圖
    bars = ax.bar(range(len(lst)),height=lst)#繪制條形圖
    for l in lsts:
        print(l)
        bars.remove()#刪除條形圖
        bars = ax.bar(range(len(lst)),height=l)#繪制條形圖
        plt.pause(0.5)
    while True:#防止圖片關(guān)閉
        plt.pause(1)

最上面的主要是用的FuncAnimation()的功能岖是,設(shè)定幀數(shù),這樣在運(yùn)行代碼的時(shí)候會(huì)一直循環(huán)实苞。這里主要是利用了plt.pause()這個(gè)方法來讓plt繪圖時(shí)候的暫停豺撑,因?yàn)閳D形中大部分的元素是沒有發(fā)生改變的,所以看起來是連貫的黔牵,如果想要播放的間隔變短聪轿,可以調(diào)整間隔的時(shí)間長(zhǎng)短,但是這種的不能一直循環(huán)猾浦,如果需要的話陆错,可以在while True的循環(huán)里面加上break,然后把for嵌套在while里面金赦,也實(shí)現(xiàn)了循環(huán)

import matplotlib.pyplot as plt
import time

def insert_sort(lst):
    lsts = []
    for i in range(len(lst)):
        temp = lst[i]
        j = i-1
        while j>=0 and lst[j]>temp:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = temp
        l = lst[:]
        lsts.append(l)
    return lsts


if __name__ == "__main__":
    lst = [13,32,42,1,53,4,66,2,5,7,74,23]
    lsts = insert_sort(lst)
    plt.ion()#打開交互模式
    fig = plt.figure()#新建繪圖窗口
    ax  = plt.gca()#獲取當(dāng)前子圖
    bars = ax.bar(range(len(lst)),height=lst)#繪制條形圖
    while True:
        for l in lsts:
            print(l)
            bars.remove()#刪除條形圖
            bars = ax.bar(range(len(lst)),height=l)#繪制條形圖
            plt.pause(0.5)
        while True:#防止圖片關(guān)閉
            plt.pause(1)
            break
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末危号,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子素邪,更是在濱河造成了極大的恐慌外莲,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異偷线,居然都是意外死亡磨确,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門声邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乏奥,“玉大人,你說我怎么就攤上這事亥曹〉肆耍” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵媳瞪,是天一觀的道長(zhǎng)骗炉。 經(jīng)常有香客問我,道長(zhǎng)蛇受,這世上最難降的妖魔是什么句葵? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮兢仰,結(jié)果婚禮上乍丈,老公的妹妹穿的比我還像新娘。我一直安慰自己把将,他們只是感情好轻专,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著察蹲,像睡著了一般铭若。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上递览,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瞳腌,去河邊找鬼绞铃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫂侍,可吹牛的內(nèi)容都是我干的儿捧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挑宠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菲盾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起各淀,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤懒鉴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體临谱,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璃俗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悉默。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片城豁。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抄课,靈堂內(nèi)的尸體忽然破棺而出唱星,到底是詐尸還是另有隱情,我是刑警寧澤跟磨,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布间聊,位于F島的核電站,受9級(jí)特大地震影響吱晒,放射性物質(zhì)發(fā)生泄漏甸饱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一仑濒、第九天 我趴在偏房一處隱蔽的房頂上張望叹话。 院中可真熱鬧,春花似錦墩瞳、人聲如沸驼壶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽热凹。三九已至,卻和暖如春泪电,著一層夾襖步出監(jiān)牢的瞬間般妙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工相速, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碟渺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓突诬,卻偏偏與公主長(zhǎng)得像苫拍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旺隙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355