用Python繪制超酷的gif動圖,驚艷了所有人
今天給大家來介紹一種制作 gif格式圖表的新方法,調用的是matplotlib的相關模塊,其中的步驟與方法也是相當?shù)睾唵我锥?/span>
下載和導入數(shù)據(jù)庫
bokeh模塊自帶的數(shù)據(jù)集,通過下面這一行代碼直接就可以下載import?bokeh
bokeh.sampledata.download()
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格式的動圖即可,代碼如下
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
我們自定義了一個繪制圖表的函數(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格式的圖表幾個,代碼如下
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

還有另外一種思路
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

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
然后我們調用animation.FuncAnimation()方法,
ani?=?animation.FuncAnimation(fig,?run,?years,?blit?=?True,?repeat?=?True,?
??????????????????????????????interval?=?600)
ani.save('文件名.gif')
output

這樣就可以一步到位生成gif格式的圖表,避免生成數(shù)十張繁多地靜態(tài)圖片了。
將若干張gif動圖放置在一張大圖當中
最后我們可以將若干張gif動圖放置在一張大的圖表當中,代碼如下
import?matplotlib.animation?as?animation
#?創(chuàng)建一個新的畫布
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

-?END - 對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數(shù)據(jù)分析技能,可以在全網搜索書名進行了解選購:

