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

          讓數(shù)據(jù)“動”起來:Python動態(tài)圖表制作!

          共 8810字,需瀏覽 18分鐘

           ·

          2020-12-06 18:32

          公眾號關(guān)注杰哥的IT之旅”,
          選擇“星標(biāo)”,重磅干貨,第一時間送達!

          來源:機器之心

          原文鏈接:https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce780421afe


          在讀技術(shù)博客的過程中,我們會發(fā)現(xiàn)那些能夠把知識、成果講透的博主很多都會做動態(tài)圖表。他們的圖是怎么做的?難度大嗎?這篇文章就介紹了 Python 中一種簡單的動態(tài)圖表制作方法。


          數(shù)據(jù)暴增的年代,數(shù)據(jù)科學(xué)家、分析師在被要求對數(shù)據(jù)有更深的理解與分析的同時,還需要將結(jié)果有效地傳遞給他人。如何讓目標(biāo)聽眾更直觀地理解?當(dāng)然是將數(shù)據(jù)可視化啊,而且最好是動態(tài)可視化。

          本文將以線型圖、條形圖和餅圖為例,系統(tǒng)地講解如何讓你的數(shù)據(jù)圖表動起來


          這些動態(tài)圖表是用什么做的?

          接觸過數(shù)據(jù)可視化的同學(xué)應(yīng)該對 Python 里的 Matplotlib 庫并不陌生。它是一個基于 Python 的開源數(shù)據(jù)繪圖包,僅需幾行代碼就可以幫助開發(fā)者生成直方圖、功率譜、條形圖、散點圖等。這個庫里有個非常實用的擴展包——FuncAnimation,可以讓我們的靜態(tài)圖表動起來。

          FuncAnimation 是 Matplotlib 庫中 Animation 類的一部分,后續(xù)會展示多個示例。如果是首次接觸,你可以將這個函數(shù)簡單地理解為一個 While 循環(huán),不停地在 “畫布” 上重新繪制目標(biāo)數(shù)據(jù)圖。

          如何使用 FuncAnimation?

          這個過程始于以下兩行代碼:

             
          import matplotlib.animation as ani

          animator = ani.FuncAnimation(fig, chartfunc, interval = 100)

          從中我們可以看到 FuncAnimation 的幾個輸入:

          • fig 是用來 「繪制圖表」的 figure 對象;

          • chartfunc 是一個以數(shù)字為輸入的函數(shù),其含義為時間序列上的時間;

          • interval 這個更好理解,是幀之間的間隔延遲,以毫秒為單位,默認值為 200。


          這是三個關(guān)鍵輸入,當(dāng)然還有更多可選輸入,感興趣的讀者可查看原文檔,這里不再贅述。

          下一步要做的就是將數(shù)據(jù)圖表參數(shù)化,從而轉(zhuǎn)換為一個函數(shù),然后將該函數(shù)時間序列中的點作為輸入,設(shè)置完成后就可以正式開始了。

          在開始之前依舊需要確認你是否對基本的數(shù)據(jù)可視化有所了解。也就是說,我們先要將數(shù)據(jù)進行可視化處理,再進行動態(tài)處理。

          按照以下代碼進行基本調(diào)用。另外,這里將采用大型流行病的傳播數(shù)據(jù)作為案例數(shù)據(jù)(包括每天的死亡人數(shù))。

             
          import matplotlib.animation as ani
          import matplotlib.pyplot as plt
          import numpy as np
          import pandas as pdurl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'
          df = pd.read_csv(url, delimiter=',', header='infer')df_interest = df.loc[
              df['Country/Region'].isin(['United Kingdom''US''Italy''Germany'])
              & df['Province/State'].isna()]df_interest.rename(
              index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
          df1 = df_interest.transpose()df1 = df1.drop(['Province/State''Country/Region''Lat''Long'])
          df1 = df1.loc[(df1 != 0).any(1)]
          df1.index = pd.to_datetime(df1.index)

          繪制三種常見動態(tài)圖表

          動態(tài)曲線圖


          如下所示,首先需要做的第一件事是定義圖的各項,這些基礎(chǔ)項設(shè)定之后就會保持不變。它們包括:創(chuàng)建 figure 對象,x 標(biāo)和 y 標(biāo),設(shè)置線條顏色和 figure 邊距等:

             
          import numpy as np
          import matplotlib.pyplot as pltcolor = ['red''green''blue''orange']
          fig = plt.figure()
          plt.xticks(rotation=45, ha="right", rotation_mode="anchor"#rotate the x-axis values
          plt.subplots_adjust(bottom = 0.2, top = 0.9#ensuring the dates (on the x-axis) fit in the screen
          plt.ylabel('No of Deaths')
          plt.xlabel('Dates')

          接下來設(shè)置 curve 函數(shù),進而使用 .FuncAnimation 讓它動起來:

             
          def buildmebarchart(i=int):
              plt.legend(df1.columns)
              p = plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point i
              for i in range(0,4):
                  p[i].set_color(color[i]) #set the colour of each curveimport matplotlib.animation as ani
          animator = ani.FuncAnimation(fig, buildmebarchart, interval = 100)
          plt.show()

          動態(tài)餅狀圖


          可以觀察到,其代碼結(jié)構(gòu)看起來與線型圖并無太大差異,但依舊有細小的差別。

             
          import numpy as np
          import matplotlib.pyplot as pltfig,ax = plt.subplots()
          explode=[0.01,0.01,0.01,0.01#pop out each slice from the piedef getmepie(i):
              def absolute_value(val): #turn % back to a number
                  a  = np.round(val/100.*df1.head(i).max().sum(), 0)
                  return int(a)
              ax.clear()
              plot = df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_value, label='',explode = explode, shadow = True)
              plot.set_title('Total Number of Deaths\n' + str(df1.index[min( i, len(df1.index)-1 )].strftime('%y-%m-%d')), fontsize=12)import matplotlib.animation as ani
          animator = ani.FuncAnimation(fig, getmepie, interval = 200)
          plt.show()

          主要區(qū)別在于,動態(tài)餅狀圖的代碼每次循環(huán)都會返回一組數(shù)值,但在線型圖中返回的是我們所在點之前的整個時間序列。返回時間序列通過 df1.head(i) 來實現(xiàn),而. max()則保證了我們僅獲得最新的數(shù)據(jù),因為流行病導(dǎo)致死亡的總數(shù)只有兩種變化:維持現(xiàn)有數(shù)量或持續(xù)上升。

             
          df1.head(i).max()

          動態(tài)條形圖


          創(chuàng)建動態(tài)條形圖的難度與上述兩個案例并無太大差別。在這個案例中,作者定義了水平和垂直兩種條形圖,讀者可以根據(jù)自己的實際需求來選擇圖表類型并定義變量欄。

             
          fig = plt.figure()
          bar = ''def buildmebarchart(i=int):
              iv = min(i, len(df1.index)-1) #the loop iterates an extra one time, which causes the dataframes to go out of bounds. This was the easiest (most lazy) way to solve this :)
              objects = df1.max().index
              y_pos = np.arange(len(objects))
              performance = df1.iloc[[iv]].values.tolist()[0]
              if bar == 'vertical':
                  plt.bar(y_pos, performance, align='center', color=['red''green''blue''orange'])
                  plt.xticks(y_pos, objects)
                  plt.ylabel('Deaths')
                  plt.xlabel('Countries')
                  plt.title('Deaths per Country \n' + str(df1.index[iv].strftime('%y-%m-%d')))
              else:
                  plt.barh(y_pos, performance, align='center', color=['red''green''blue''orange'])
                  plt.yticks(y_pos, objects)
                  plt.xlabel('Deaths')
                  plt.ylabel('Countries')animator = ani.FuncAnimation(fig, buildmebarchart, interval=100)plt.show()

          保存動畫圖

          在制作完成后,存儲這些動態(tài)圖就非常簡單了,可直接使用以下代碼:

             
          animator.save(r'C:\temp\myfirstAnimation.gif')

          感興趣的讀者如想獲得詳細信息可參考https://matplotlib.org/3.1.1/api/animation_api.html。

          如果您覺得這篇文章對您有點用的話,麻煩您為本文來個四連:轉(zhuǎn)發(fā)分享、點贊、點在看、留言,因為這將是我寫作與分享更多優(yōu)質(zhì)文章的最強動力!


          本公眾號全部博文已整理成一個目錄,請在公眾號后臺回復(fù)「m」獲取!

          推薦閱讀:

          1、花費一周整理的Python資源,讓我學(xué)習(xí)效率,事半功倍!
          2、超全!我把 Python 的 200 個標(biāo)準(zhǔn)庫整理出來了!
          3、40000字 Matplotlib 實操干貨,真的全!
          4、為了探究妹紙對內(nèi)衣的喜好,我爬了淘寶內(nèi)衣店的數(shù)據(jù)!
          5、任意爬取!超全開源爬蟲工具箱
          6、11 種方法教你用 Python 高效下載資源!

               
                 
          點個[在看],是對杰哥最大的支持!
          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  91青娱乐极品盛宴 | 欧美三级在线观看网页 | 色婷婷视频一区二区 | 熟女人妻X88AV | 亚洲日韩欧美视频 |