您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么用Python繪制超酷的gif動(dòng)圖”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用Python繪制超酷的gif動(dòng)圖”吧!
我們這次用到的數(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
我們可以先繪制若干張靜態(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
這樣我們就生成了若干張靜態(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
可能看到這兒,有人會(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
然后我們自定義一個(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
這樣就可以一步到位生成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)圖”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(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)容。