<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1273字,需瀏覽 3分鐘

           ·

          2022-05-15 06:36

          今天給大家來介紹一種制作gif格式圖表的新方法,調用的是matplotlib的相關模塊,其中的步驟與方法也是相當?shù)睾唵我锥?/span>

          下載和導入數(shù)據(jù)庫

          我們這次用到的數(shù)據(jù)集是bokeh模塊自帶的數(shù)據(jù)集,通過下面這一行代碼直接就可以下載

          import?bokeh
          bokeh.sampledata.download()

          然后導入后面要用到的數(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)的圖表

          我們可以先繪制若干張靜態(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?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

          還有另外一種思路

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

          然后我們自定義一個繪制圖表的函數(shù),其中參數(shù)為年份,目的在于通過年份來篩選出相對應的數(shù)據(jù)并且繪制出相對應的圖表

          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ù)分析技能,可以在全網搜索書名進行了解選購
          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  A片好视频| 日韩男女操B短视频 | 国产高清无码视频在线观看 | 无码一区二区三区三 | 欧美亚韩一区二区三区 |