<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>

          強(qiáng)烈推薦一個(gè)Python可視化模塊,簡單又好用

          共 5521字,需瀏覽 12分鐘

           ·

          2023-07-05 05:14

          數(shù)據(jù)可視化動(dòng)畫還在用Excel做?現(xiàn)在一個(gè)簡單的Python包就能分分鐘搞定!而且生成的動(dòng)畫也足夠絲滑,效果是醬紫的:?

          f9b3e51446a5eaf950b9c3271f1250d1.webp

          這是一位專攻Python語言的程序員開發(fā)的安裝包,名叫Pynimate。目前可以直接通過PyPI安裝使用。

          25509171ba754f116f0deb079f675f81.webp

          使用指南

          想要使用Pynimate,直接import一下就行。

                  import?pynimate?as?nim?

          輸入數(shù)據(jù)后,Pynimate將使用函數(shù)Barplot()來創(chuàng)建條形數(shù)據(jù)動(dòng)畫。而創(chuàng)建這種動(dòng)畫,輸入的數(shù)據(jù)必須是pandas數(shù)據(jù)結(jié)構(gòu)(如下),其中將時(shí)間列設(shè)置為索引,換句話說索引代表的是自變量。

                time,?col1,?col2,?col3
          2012???1?????2?????1
          2013???1?????1?????2
          2014???2?????1.5???3
          2015???2.5???2?????3.5

          具體的代碼形式如下:

                import?pandas?as?pd
          df?=?pd.read_csv('data'csv').set_index('time')

          比如要處理具體的數(shù)據(jù),寫成代碼應(yīng)該是這樣子的。

                df?=?pd.DataFrame(
          ????{
          ????????"time":?["1960-01-01",?"1961-01-01",?"1962-01-01"],
          ????????"Afghanistan":?[1,?2,?3],
          ????????"Angola":?[2,?3,?4],
          ????????"Albania":?[1,?2,?5],
          ????????"USA":?[5,?3,?4],
          ????????"Argentina":?[1,?4,?5],
          ????}
          ).set_index("time")

          此外,要制作條形數(shù)據(jù)動(dòng)畫,Barplot還有三個(gè)必需的參數(shù)得注意:data、time_format和ip_freq(Interpolation frequency)。

          data就是表格的數(shù)據(jù),這里也就不再贅述。

          time_format是指數(shù)據(jù)索引的時(shí)間日期格式,一般為:”%Y-%m-%d”。

          最后是ip_freq,它是制作動(dòng)畫中比較關(guān)鍵的一步,通過線性插值使動(dòng)畫更加流暢絲滑。

          一般來說,并不是所有的原始數(shù)據(jù)都適合做成動(dòng)畫,現(xiàn)在一個(gè)典型的視頻是24fps,即每秒有24幀。舉個(gè)栗子??,下面這個(gè)表格中的數(shù)據(jù)只有三個(gè)時(shí)間點(diǎn),按理說只能生成3幀視頻,最終動(dòng)畫也只有3/24秒。

                time,?col1,?col2
          2012???1?????3??
          2013???2?????2???
          2014???3?????1

          這時(shí)候,ip_freq插值(線性)就開始發(fā)揮作用了,如果插值是一個(gè)季度,則得出的數(shù)據(jù)就變成了這樣:

                time?????col1??col2
          2012-01-01??1.00??3.00
          2012-04-01??1.25??2.75
          2012-07-01??1.50??2.50
          2012-10-01??1.75??2.25
          2013-01-01??2.00??2.00
          2013-04-01??2.25??1.75
          2013-07-01??2.50??1.50
          2013-10-01??2.75??1.25
          2014-01-01??3.00??1.00

          具體的插值時(shí)間間隔為多久,則要視具體的數(shù)據(jù)而定,一般繪制大數(shù)據(jù)時(shí),設(shè)置為ip_freq = None。至此,就能生成數(shù)據(jù)動(dòng)畫了,完整代碼如下所示:

                from?matplotlib?import?pyplot?as?plt
          import?pandas?as?pd
          import?pynimate?as?nim

          df?=?pd.DataFrame(
          ????{
          ????????"time":?["1960-01-01",?"1961-01-01",?"1962-01-01"],
          ????????"Afghanistan":?[1,?2,?3],
          ????????"Angola":?[2,?3,?4],
          ????????"Albania":?[1,?2,?5],
          ????????"USA":?[5,?3,?4],
          ????????"Argentina":?[1,?4,?5],
          ????}
          ).set_index("time")

          cnv?=?nim.Canvas()
          bar?=?nim.Barplot(df,?"%Y-%m-%d",?"2d")
          bar.set_time(callback=lambda?i,?datafier:?datafier.data.index[i].year)
          cnv.add_plot(bar)
          cnv.animate()
          plt.show()

          這是插值為兩天,生成的動(dòng)畫效果。

          最后還有一個(gè)問題,那就是保存動(dòng)畫,有兩個(gè)格式可以選擇:gif或者mp4。保存為動(dòng)圖一般使用:

                cnv.save("file",?24,?"gif")

          若要保存為mp4的話,ffmpeg是個(gè)不錯(cuò)的選擇,它是保存為mp4的標(biāo)準(zhǔn)編寫器。

                pip?install?ffmpeg-python

          或者

                conda?install?ffmpeg

          當(dāng)然,同樣也可以使用Canvas.save()來保存。

                cnv.save("file",?24?,"mp4")



          兩個(gè)官方示例。

          第一個(gè)示例比較簡單,代碼如下。

                    from?matplotlib?import?pyplot?as?plt
          import?pandas?as?pd
          import?pynimate?as?nim

          #?數(shù)據(jù)格式+索引
          df?=?pd.DataFrame(
          ????{
          ????????"time":?["1960-01-01",?"1961-01-01",?"1962-01-01"],
          ????????"Afghanistan":?[1,?2,?3],
          ????????"Angola":?[2,?3,?4],
          ????????"Albania":?[1,?2,?5],
          ????????"USA":?[5,?3,?4],
          ????????"Argentina":?[1,?4,?5],
          ????}
          ).set_index("time")

          #?Canvas類是動(dòng)畫的基礎(chǔ)
          cnv?=?nim.Canvas()
          #?使用Barplot模塊創(chuàng)建一個(gè)動(dòng)態(tài)條形圖,?插值頻率為2天
          bar?=?nim.Barplot(df,?"%Y-%m-%d",?"2d")
          #?使用了回調(diào)函數(shù),?返回以月、年為單位格式化的datetime
          bar.set_time(callback=lambda?i,?datafier:?datafier.data.index[i].year)
          #?將條形圖添加到畫布中
          cnv.add_plot(bar)
          cnv.animate()
          plt.show()

          Canvas類是動(dòng)畫的基礎(chǔ),它會(huì)處理matplotlib圖、子圖以及創(chuàng)建和保存動(dòng)畫。

          Barplot模塊創(chuàng)建動(dòng)態(tài)條形圖,有三個(gè)必傳參數(shù),data、time_format、ip_freq。

          分別為數(shù)據(jù)、時(shí)間格式、插值頻率(控制刷新頻率)。

          效果如下,就是一個(gè)簡單的動(dòng)態(tài)條形圖。

          5603f26af24e2ba91bcca53646828c7e.webp

          我們還可以將結(jié)果保存為GIF或者是mp4,其中mp4需要安裝ffmpeg。

                    #?保存gif,?1秒24幀
          cnv.save("file",?24,?"gif")

          #?電腦安裝好ffmpeg后,?安裝Python庫
          pip?install?ffmpeg-python

          #?保存mp4,?1秒24幀
          cnv.save("file",?24?,"mp4")
          第二個(gè)示例相對復(fù)雜一些,可以自定義參數(shù),樣式設(shè)置成深色模式。

          from?matplotlib?import?pyplot?as?plt
          import?numpy?as?np
          import?pandas?as?pd
          import?pynimate?as?nim


          #?更新條形圖
          def?post_update(ax,?i,?datafier,?bar_attr):
          ????ax.spines["top"].set_visible(False)
          ????ax.spines["right"].set_visible(False)
          ????ax.spines["bottom"].set_visible(False)
          ????ax.spines["left"].set_visible(False)
          ????ax.set_facecolor("#001219")
          ????for?bar,?x,?y?in?zip(
          ????????bar_attr.top_bars,
          ????????bar_attr.bar_length,
          ????????bar_attr.bar_rank,
          ????):
          ????????ax.text(
          ????????????x?-?0.3,
          ????????????y,
          ????????????datafier.col_var.loc[bar,?"continent"],
          ????????????ha="right",
          ????????????color="k",
          ????????????size=12,
          ????????)


          #?讀取數(shù)據(jù)
          df?=?pd.read_csv("sample.csv").set_index("time")
          #?分類
          col?=?pd.DataFrame(
          ????{
          ????????"columns":?["Afghanistan",?"Angola",?"Albania",?"USA",?"Argentina"],
          ????????"continent":?["Asia",?"Africa",?"Europe",?"N?America",?"S?America"],
          ????}
          ).set_index("columns")
          #?顏色
          bar_cols?=?{
          ????"Afghanistan":?"#2a9d8f",
          ????"Angola":?"#e9c46a",
          ????"Albania":?"#e76f51",
          ????"USA":?"#a7c957",
          ????"Argentina":?"#e5989b",
          }

          #?新建畫布
          cnv?=?nim.Canvas(figsize=(12.8,?7.2),?facecolor="#001219")
          bar?=?nim.Barplot(
          ????df,?"%Y-%m-%d",?"3d",?post_update=post_update,?rounded_edges=True,?grid=False
          )
          #?條形圖分類
          bar.add_var(col_var=col)
          #?條形圖顏色
          bar.set_bar_color(bar_cols)
          #?標(biāo)題設(shè)置
          bar.set_title("Sample?Title",?color="w",?weight=600)
          #?x軸設(shè)置
          bar.set_xlabel("xlabel",?color="w")
          #?時(shí)間設(shè)置
          bar.set_time(
          ????callback=lambda?i,?datafier:?datafier.data.index[i].strftime("%b,?%Y"),?color="w"
          )
          #?文字顯示
          bar.set_text(
          ????"sum",
          ????callback=lambda?i,?datafier:?f"Total?:{np.round(datafier.data.iloc[i].sum(),2)}",
          ????size=20,
          ????x=0.72,
          ????y=0.20,
          ????color="w",
          )

          #?文字顏色設(shè)置
          bar.set_bar_annots(color="w",?size=13)
          bar.set_xticks(colors="w",?length=0,?labelsize=13)
          bar.set_yticks(colors="w",?labelsize=13)
          #?條形圖邊框設(shè)置
          bar.set_bar_border_props(
          ????edge_color="black",?pad=0.1,?mutation_aspect=1,?radius=0.2,?mutation_scale=0.6
          )
          cnv.add_plot(bar)
          cnv.animate()
          #?顯示
          #?plt.show()
          #?保存gif
          cnv.save("example3",?24,?"gif")

          效果如下,可以看出比上面的簡單示例好看了不少。

          89afd1c2954bf8d0c2c8195e04d67c58.webp


          瀏覽 86
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  日韩无码免费看 | 日韩潮吹| 无码一级操逼逼 | 爽灬爽灬爽灬高潮无码视频直播 | 台湾中文无码 |