溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用Python繪制超酷的gif動(dòng)圖

發(fā)布時(shí)間:2023-05-05 09:17:25 來源:億速云 閱讀:105 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“怎么用Python繪制超酷的gif動(dòng)圖”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用Python繪制超酷的gif動(dòng)圖”吧!

下載和導(dǎo)入數(shù)據(jù)庫

我們這次用到的數(shù)據(jù)集是bokeh模塊自帶的數(shù)據(jù)集,通過下面這一行代碼直接就可以下載

import bokeh
bokeh.sampledata.download()

然后導(dǎo)入后面要用到的數(shù)據(jù)集,我們挑選的是指定國家的1950年至今不同年齡階段的人口所占比重的數(shù)據(jù)

from bokeh.sampledata.population import data
import numpy as np

data = filter_loc('United States of America')
data.head()

output

怎么用Python繪制超酷的gif動(dòng)圖

先繪制若干張靜態(tài)的圖表

我們可以先繪制若干張靜態(tài)的圖表,然后將這幾張圖表合成一張gif格式的動(dòng)圖即可,代碼如下

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patheffects as fx

# 繪制圖表的函數(shù)
def make_plot(year):
    
    # 根據(jù)年份來篩選出數(shù)據(jù)
    df = data[data.Year == year]
        
    # 制作圖表
    fig, (ax1, ax2) = plt.subplots(1, 2, sharey = True)
    ax1.invert_xaxis()
    fig.subplots_adjust(wspace = 0) 
    
    ax1.barh(df[df.Sex == 'Male'].AgeGrp, df[df.Sex == 'Male'].percent, label = 'Male')
    ax2.barh(df[df.Sex == 'Female'].AgeGrp, df[df.Sex == 'Female'].percent, label = 'Female', color = 'C1')
    
    country = df.Location.iloc[0]
    if country == 'United States of America': country == 'US'
        
    fig.suptitle(f'......')
    fig.supxlabel('......')
    fig.legend(bbox_to_anchor = (0.9, 0.88), loc = 'upper right')
    ax1.set_ylabel('Age Groups')
    
    return fig

我們自定義了一個(gè)繪制圖表的函數(shù),其中的參數(shù)是年份,邏輯很簡單,我們是想根據(jù)年份來篩選出數(shù)據(jù),然后根據(jù)篩選出的數(shù)據(jù)來繪制圖表,每一年的圖表不盡相同

years = [i for i in set(data.Year) if i < 2022]
years.sort()

for year in years:
    fig = make_plot(year)
    fig.savefig(f'{year}.jpeg',bbox_inches = 'tight')

output

怎么用Python繪制超酷的gif動(dòng)圖

這樣我們就生成了若干張靜態(tài)的圖表,然后集合成gif格式的圖表幾個(gè),代碼如下

import matplotlib.animation as animation
fig, ax = plt.subplots()
ims = []

for year in years:
    im = ax.imshow(plt.imread(f'{year}.jpeg'), animated = True)
    ims.append([im])

ani = animation.ArtistAnimation(fig, ims, interval=600)
ani.save('us_population.gif')

output

怎么用Python繪制超酷的gif動(dòng)圖怎么用Python繪制超酷的gif動(dòng)圖

還有另外一種思路

可能看到這兒,有人會(huì)覺得上面提到的方法稍顯麻煩,畢竟我們需要先生成數(shù)十張靜態(tài)的圖表,要是電腦的磁盤空間有點(diǎn)緊張的話,或者還沒有這樣的一個(gè)地方來存放這數(shù)十張的圖表。于是乎就會(huì)疑問道,是不是可以一步到位的來。當(dāng)然也是可以的,例如我們打算繪制1950年到2020年不同年齡階段的人口比例分布圖,首先第一步在于我們先要繪制1950年,也就是起始年,該年不同年齡階段的人口比例分布圖,代碼如下

fig, (ax1, ax2) = plt.subplots(1, 2, sharey = True)
   
df = data[data.Year == 1955]

y_pos = [i for i in range(len(df[df.Sex == 'Male']))]
male = ax1.barh(y_pos, df[df.Sex == 'Male'].percent, label = 'Male',
               tick_label = df[df.Sex == 'Male'].AgeGrp)
female = ax2.barh(y_pos, df[df.Sex == 'Female'].percent, label = 'Female', 
                  color = 'C1', tick_label = df[df.Sex == 'Male'].AgeGrp)

ax1.invert_xaxis()
fig.suptitle('.......')
fig.supxlabel('....... (%)')
fig.legend(bbox_to_anchor = (0.9, 0.88), loc = 'upper right')
ax1.set_ylabel('Age Groups')

output

怎么用Python繪制超酷的gif動(dòng)圖

然后我們自定義一個(gè)繪制圖表的函數(shù),其中參數(shù)為年份,目的在于通過年份來篩選出相對應(yīng)的數(shù)據(jù)并且繪制出相對應(yīng)的圖表

def run(year):
    # 通過年份來篩選出數(shù)據(jù)
    df = data[data.Year == year]
    # 針對不同地性別來繪制
    total_pop = df.Value.sum()
    df['percent'] = df.Value / total_pop * 100
    male.remove()
    y_pos = [i for i in range(len(df[df.Sex == 'Male']))]
    male.patches = ax1.barh(y_pos, df[df.Sex == 'Male'].percent, label = 'Male', 
                     color = 'C0', tick_label = df[df.Sex == 'Male'].AgeGrp)
    female.remove()
    female.patches = ax2.barh(y_pos, df[df.Sex == 'Female'].percent, label = 'Female',
                 
                 color = 'C1', tick_label = df[df.Sex == 'Female'].AgeGrp)

    text.set_text(year)
    return male#, female

然后我們調(diào)用animation.FuncAnimation()方法,

ani = animation.FuncAnimation(fig, run, years, blit = True, repeat = True, 
                              interval = 600)
ani.save('文件名.gif')

output

怎么用Python繪制超酷的gif動(dòng)圖

這樣就可以一步到位生成gif格式的圖表,避免生成數(shù)十張繁多地靜態(tài)圖片了。

將若干張gif動(dòng)圖放置在一張大圖當(dāng)中

最后我們可以將若干張gif動(dòng)圖放置在一張大的圖表當(dāng)中,代碼如下

import matplotlib.animation as animation

# 創(chuàng)建一個(gè)新的畫布
fig, (ax, ax2, ax3) = plt.subplots(1, 3, figsize = (10, 3))

ims = []
for year in years:
    im = ax.imshow(plt.imread(f'文件1{year}.jpeg'), animated = True)
    im2 = ax2.imshow(plt.imread(f'文件2{year}.jpeg'), animated = True)
    im3 = ax3.imshow(plt.imread(f'文件3{year}.jpeg'), animated = True)
    ims.append([im, im2, im3])

ani = animation.ArtistAnimation(fig, ims, interval=600)
ani.save('comparison.gif')

output

怎么用Python繪制超酷的gif動(dòng)圖

到此,相信大家對“怎么用Python繪制超酷的gif動(dòng)圖”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI