新聞中心
在之前的一篇文章當(dāng)中,小編當(dāng)時(shí)分享了如何用??Python???當(dāng)中的??gif???模塊來(lái)制作??gif??格式的圖表,

成都創(chuàng)新互聯(lián)公司主營(yíng)磴口網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app開(kāi)發(fā)定制,磴口h5重慶小程序開(kāi)發(fā)搭建,磴口網(wǎng)站營(yíng)銷(xiāo)推廣歡迎磴口等地區(qū)企業(yè)咨詢(xún)
厲害了,用Python繪制動(dòng)態(tài)可視化圖表,并保存成gif格式今天小編再給大家來(lái)介紹一種制作??gif???格式圖表的新方法,調(diào)用的是??matplotlib??的相關(guān)模塊,其中的步驟與方法也是相當(dāng)?shù)睾?jiǎn)單易懂。
下載和導(dǎo)入數(shù)據(jù)庫(kù)
我們這次用到的數(shù)據(jù)集是??bokeh??模塊自帶的數(shù)據(jù)集,通過(guò)下面這一行代碼直接就可以下載
import bokeh
bokeh.sampledata.download()
然后導(dǎo)入后面要用到的數(shù)據(jù)集,我們挑選的是指定國(guó)家的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)的圖表
我們可以先繪制若干張靜態(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ù)年份來(lái)篩選出數(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ù)是年份,邏輯很簡(jiǎn)單,我們是想根據(jù)年份來(lái)篩選出數(shù)據(jù),然后根據(jù)篩選出的數(shù)據(jù)來(lái)繪制圖表,每一年的圖表不盡相同
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ì)覺(jué)得上面提到的方法稍顯麻煩,畢竟我們需要先生成數(shù)十張靜態(tài)的圖表,要是電腦的磁盤(pán)空間有點(diǎn)緊張的話,或者還沒(méi)有這樣的一個(gè)地方來(lái)存放這數(shù)十張的圖表。于是乎就會(huì)疑問(wèn)道,是不是可以一步到位的來(lái)。當(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ù)為年份,目的在于通過(guò)年份來(lái)篩選出相對(duì)應(yīng)的數(shù)據(jù)并且繪制出相對(duì)應(yīng)的圖表
def run(year):
# 通過(guò)年份來(lái)篩選出數(shù)據(jù)
df = data[data.Year == year]
# 針對(duì)不同地性別來(lái)繪制
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è)新的畫(huà)布
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
當(dāng)前題目:用Python繪制超酷的gif動(dòng)圖,驚艷了所有人
文章路徑:http://fisionsoft.com.cn/article/cocdooi.html


咨詢(xún)
建站咨詢(xún)
