首頁 > 後端開發 > Python教學 > 用Python繪製超酷的gif動圖,驚艷了所有人

用Python繪製超酷的gif動圖,驚艷了所有人

WBOY
發布: 2023-05-04 16:19:07
轉載
1328 人瀏覽過

用Python繪製超酷的gif動圖,驚艷了所有人

在先前的一篇文章當中,小編當時分享瞭如何使用#Python#gifgif模組來製作gif格式的圖表,

厲害了,用Python繪製動態視覺化圖表,並保存成gif格式今天小編再給大家來介紹製作一種製作

gifgif格式圖表的新方法,調用的是matplotlib#的相關模組,其中的步驟與方法相當簡單易懂。

下載和導入資料庫

我們這次用到的資料集是

bokeh模組自帶的資料集,通過下面這一行程式碼直接就可以下載

import bokeh
bokeh.sampledata.download()


登入後複製

然後導入後面要用到的資料集,我們挑選的是指定國家的1950年至今不同年齡階段的人口所佔比重的資料

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

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


登入後複製

output

用Python繪製超酷的gif動圖,驚艷了所有人

先繪製若干張靜態的圖表

我們可以先繪製若干張靜態的圖表,然後將這幾張圖表合成一張

gif格式的動圖即可,程式碼如下

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

# 绘制图表的函数
def make_plot(year):
    
    # 根据年份来筛选出数据
    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


登入後複製

我們自訂了一個繪製圖表的函數,其中的參數是年份,邏輯很簡單,我們是想根據年份來篩選出數據,然後根據篩選出的數據來繪製圖表,每一年的圖表不盡相同

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動圖,驚艷了所有人

這樣我們就產生了若干張靜態的圖表,然後集合成

gifgif格式的圖表幾個,程式碼如下

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動圖,驚艷了所有人用Python繪製超酷的gif動圖,驚艷了所有人

還有另一個想法

可能看到這兒,有人會覺得上面提到的方法稍顯麻煩,畢竟我們需要先生成數十張靜態的圖表,要是電腦的磁碟空間有點緊張的話,或者還沒有這樣的一個地方來存放這數十張的圖表。於是乎就會疑問道,是不是可以一步到位的來。當然也是可以的,例如我們打算繪製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動圖,驚艷了所有人

然後我們自訂一個繪製圖表的函數,其中參數為年份,目的在於透過年份來篩選出相對應的數據並且繪製出相對應的圖表

def run(year):
    # 通过年份来筛选出数据
    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


登入後複製

然后我们调用​​animation.FuncAnimation()​​方法,

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


登入後複製

output

用Python繪製超酷的gif動圖,驚艷了所有人

这样就可以一步到位生成​​gif​​格式的图表,避免生成数十张繁多地静态图片了。

将若干张​<span style="color: #2b2b2b;">gif</span>​动图放置在一张大图当中

最后我们可以将若干张​​gif​​动图放置在一张大的图表当中,代码如下

import matplotlib.animation as animation

# 创建一个新的画布
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動圖,驚艷了所有人


以上是用Python繪製超酷的gif動圖,驚艷了所有人的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板