作者:俊欣
來源:關於數據分析與可視化
importbokehbokeh.sampledata.download()
frombokeh.sampledata.populationimportdataimportnumpyasnpdata=filter_loc('UnitedStatesofAmerica')data.head()
output
我們可以先繪製若干張靜態的圖表,然後將這幾張圖表合成一張gif格式的動圖即可,代碼如下
importseabornassnsimportmatplotlib.pyplotaspltimportmatplotlib.patheffectsasfx#繪製圖表的函數defmake_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]ifcountry=='UnitedStatesofAmerica':country=='US'fig.suptitle(f'......')fig.supxlabel('......')fig.legend(bbox_to_anchor=(0.9,0.88),loc='upperright')ax1.set_ylabel('AgeGroups')returnfig
我們自定義了一個繪製圖表的函數,其中的參數是年份,邏輯很簡單,我們是想根據年份來篩選出數據,然後根據篩選出的數據來繪製圖表,每一年的圖表不盡相同
years=[iforiinset(data.Year)ifi<2022]years.sort()foryearinyears:fig=make_plot(year)fig.savefig(f'{year}.jpeg',bbox_inches='tight')
output
這樣我們就生成了若干張靜態的圖表,然後集合成gif格式的圖表幾個,代碼如下
importmatplotlib.animationasanimationfig,ax=plt.subplots()ims=[]foryearinyears: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=[iforiinrange(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='upperright')ax1.set_ylabel('AgeGroups')
output
defrun(year):#通過年份來篩選出數據df=data[data.Year==year]#針對不同地性別來繪製total_pop=df.Value.sum()df['percent']=df.Value/total_pop*100male.remove()y_pos=[iforiinrange(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)returnmale#,female
然後我們調用animation.FuncAnimation()方法,
ani=animation.FuncAnimation(fig,run,years,blit=True,repeat=True,interval=600)ani.save('文件名.gif')
output
這樣就可以一步到位生成gif格式的圖表,避免生成數十張繁多地靜態圖片了。
將若干張gif動圖放置在一張大圖當中最後我們可以將若干張gif動圖放置在一張大的圖表當中,代碼如下
importmatplotlib.animationasanimation#創建一個新的畫布fig,(ax,ax2,ax3)=plt.subplots(1,3,figsize=(10,3))ims=[]foryearinyears: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
點這裡👇關注我,記得標星哦~
推薦閱讀
CDA課程諮詢
