用Python繪製一套「會跳舞」的動態圖形

2020-12-09 騰訊網

作者:Costas Andreou

機器之心編譯

參與:Jamin,張倩

看這優美的舞姿

數據暴增的年代,數據科學家,分析師在被要求對數據有更深的理解與分析的同時,還需要將結果有效地傳遞給他人。如何讓目標聽眾更直觀地理解?當然是將數據可視化啊,最而且好的英文動態可視化。

本文將以線型圖,條形圖和餅圖為例,系統地講解如何讓你的數據圖表動起來

這些動態圖表是用什麼做的?

是一個基於Python的開源數據繪圖包,僅需幾行代碼就可以幫助開發者生成直方圖,功率譜,條形圖,散點圖等。這個庫裡有個非常實用的擴展包——FuncAnimation,可以讓我們的靜態圖表動起來。

FuncAnimation是Matplotlib庫中的動畫類的一部分,後續會展示多個示例。如果是首次接觸,您可以將這個函數簡單地理解為一個,同時循環,不停地在「畫布」上重新放置目標數據圖。

如何使用FuncAnimation?

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

import matplotlib.animation as ani

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

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

fig是用來「繪製圖表」的Figure對象;

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

interval這個更好理解,是幀之間的間隔延遲,以毫米為單位,至少更改200。

這是三個關鍵輸入,當然還有更多可選輸入,感興趣的讀者可查看原文檔,這裡不再贅述。

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

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

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

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)

繪製三種常見動態圖表

繪製動態線型圖

如下所示,首先需要做的第一件事是定義圖的各項,這些基礎項設定之後就會保持不變。它們包括:創建 figure 對象,x 標和 y 標,設置線條顏色和 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')

接下來設置 curve 函數,進而使用 .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()

動態餅狀圖

可以觀察到,其代碼結構看起來與線型圖並無太大差異,但依舊有細小的差別。

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

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

df1.head(i).max()

動態條形圖

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

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

在製作完成後,存儲這些動態圖就非常簡單了,可直接使用以下代碼:

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

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

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

書籍推薦

《Python實戰指南——手把手教你掌握300個精彩案例》

書籍介紹:Python編程者的實戰演練全書!手把手教你Python編程入門,精彩案例助你二次開發!五位知名專家聯袂推薦!提供源程序

相關焦點

  • 有人說Python是青銅?我用50行Python代碼繪製3D機場分布圖
    我用50行Python代碼繪製3D機場分布圖 繪製一款的3D圖形,不僅可以直觀的展示數據分析的結果,也更方便數據化運營,同時也讓工作成果更容易被大眾理解。本文就基於python繪製一款基礎的3D地圖,用於直觀展示全國機場的分布情況,以及該機場出發的航班數量。
  • 統計圖形自己就可搞定,一文學會用Python繪製經典餅圖
    餅圖,應該是大家比較熟悉的圖形了吧,作為用來展示定性數據比例分布特徵的經典統計圖形,通過餅圖,你可以很直觀地看到各組數據的佔比情況哦,上次已經和大家探討了如何用Python來繪製經典的階梯圖,今天呢,咱們繼續深入聊聊哦,看看在Python中如何繪製更為經典和常用的餅圖
  • 少兒Python編程培訓手冊系列之——平面圖形繪製的基本思路
    在Python中使用海龜庫(turtle)繪製平面圖形,就類似於駕馭「小海龜」汽車,遨遊在Python世界的畫布上,同樣也需要三步操作。首先,需要掌握基本的繪圖命令和流程控制語句。本文通過一個圖形的不同擺放,來分析梳理繪製平面圖形的基本思路和流程。
  • 用Python的Pandas和Matplotlib繪製股票KDJ指標線
    其中的關鍵步驟是,通過第25行的程序代碼從指定的csv文件中讀取股票交易數據,隨後在第30行到第32行的程序代碼中,調用plot方法分別用三種不同的顏色繪製了KDJ線,因為在繪製時通過label參數設置了標籤,所以可以執行第33行的程序代碼來繪製圖例。
  • 非分裂式餅圖你會繪製嗎?一文學會如何用Python搞定
    ()函數來繪製分裂式餅圖,今天呢,咱們繼續深入介紹一下餅圖的繪製!就來說一下如何繪製非分裂式餅圖吧!其實在Python中繪製非分裂式餅圖與上次咱們介紹的繪製分裂式餅圖用的是同一個函數,依然是pie()函數,唯一的區別只是pie()函數中的參數設置不同!
  • 這些好看的化學化工圖形是如何繪製的?
    與文字敘述相比,圖形能夠更加形象、直觀地表達科學內容與技術知識,作為化工專業的學生,不管是做化工設計,還是寫科技論文,經常需要繪製工藝流程圖、實驗裝置圖、反應機理圖等等,除了最常用的Word、Excel、PPT,以及專業的繪圖軟體AutoCAD和科研必備萬能的Photoshop ,
  • 堆積直方圖你會用Python繪製嗎?一文講透,拿走不謝
    matplotlib庫,作為Python進行數據可視化的經典和最為常用庫,是Python進行二維圖表繪製必須掌握的內容,上次已經和大家探討了如何用matplotlib庫中的hist()函數來繪製直方圖,那今天呢,咱們就再深化一下,看看如何繪製經典的
  • 學Python有意思嗎?自學可以出去工作嗎?
    為什麼會難呢?可以加1547251666,好友,具體聊一下學習的方法。圖形庫,還可引用廣泛的第三方庫,這些可以畫出世界上最美的圖形……最後我要強調一下python最值得我們去學的一點,即是它有強大的第三方庫,而且,而且它在日益增多,增長速度也絕對超乎你的想像。
  • 常用的十大 python 圖像處理工具
    OpenCV-Python 是OpenCV的python版API。OpenCV-Python的優點不只有高效,這源於它的內部組成是用C/C++編寫的,而且它還容易編寫和部署(因為前端是用Python包裝的)。這使得它成為執行計算密集型計算機視覺程序的一個很好的選擇。
  • Python繪製直方圖你真的會嗎?一文細講,拿走不謝
    matplotlib庫作為Python的經典和最為常用的數據可視化庫,它擁有強大的繪製圖表的能力,最近我們一直在講解Python數據可視化相關的東東,上次已經和大家詳細探討了如何在Python中繪製漂亮的餅圖,今天呢,咱們繼續探討另一種常用圖形,它就是大家很熟悉的直方圖
  • 不再羨慕別人的漂亮圖表,一文學會如何用Python繪製堆積圖
    如果用Python進行繪製圖表,大家會如何操作呢?相信肯定會用到matplotlib庫,作為Python專業的二維和三維可視化庫之一,matplotlib庫是目前Python進行數據可視化最為常用的庫。
  • 誤差棒圖你真的會嗎?一文幫你用Python繪製,拿走不謝
    在Python的數據可視化中,matplotlib庫是最為常用和最為經典的二維數據繪圖庫,因此如果在Python編程中,想要繪製漂亮的圖表,首先你要掌握matplotlib庫中的函數使用方法,最近和大家一直在探討如何用Python繪製圖表的內容,那麼今天呢,咱們繼續來聊聊Python數據可視化中有關圖表的繪製問題。
  • 推薦7款好用的Python工具
    大多數企業從各種來源收集數據,每個數據流提供的信號理想地匯集在一起形成有用的見解。但是,能否充分利用數據取決於是否有合適的工具來清理、準備、合併並正確分析。PuLP是一個用python編寫的線性編程建模器。PuLP可以生成LP文件並使用高度優化的解算器,GLPK,COIN CLP / CBC,CPLEX和GUROBI來解決這些線性問題。
  • python繪圖第二彈來襲,教你會py畫櫻花樹,女朋友都驚呆了
    python可以用來繪畫這個都是借用python繪圖Turtle庫,其是目前流行的繪製圖像的函數庫。而這期羽憶教程為您介紹如何用python畫櫻花樹,不僅浪漫,而且簡單方便。python畫櫻花樹python畫櫻花樹如何用pythong畫櫻花樹呢
  • 幾行代碼完成動態圖表繪製|Python實戰
    作者 | 小F來源 | 法納斯特頭圖 | CSDN下載自視覺中國關於動態條形圖,小F以前推薦過「Bar Chart Race」這個庫。三行代碼就能實現動態條形圖的繪製。有些同學在使用的時候,會出現一些錯誤。一個是加載文件報錯,另一個是生成GIF的時候報錯。這是因為作者的示例是網絡加載數據,會讀取不到。通過讀取本地文件,就不會出錯。GIF生成失敗一般是需要安裝imagemagick(圖片處理工具)。
  • 如何使用AI繪製一個圓環?如何繪製有立體感的圖形?
    使用AI工具來繪製一個圓環就必須使用路徑查找器中的分割命令,下面來看看如何操作吧!1.我們製作圓環之前先要畫出一個正圓來。2.Ctrl加c,然後Ctrl加f原位複製圓形。7.在空白處點擊一下,選中中間的圓形刪除就可以完成繪製了。AI製作立體感的圖形必須要添加一些陰影,不過有一些簡單的方法,下面來看看如何製作立體感的圖形吧。1.我們要將圖中的圓環製作一個立體的感覺。
  • 用代碼敲出櫻花開放,你也可以!
    嘿嘿,這可難不倒我們武大的小夥伴——他們用手裡的代碼,敲出了一朵朵櫻花綻放的美麗奇觀!看一朵花開,等花開成海,和武大櫻花一起為武漢加油!這究竟是怎麼一回事兒?又究竟是如何實現的呢,快隨小編一起來看看吧!視頻大家在微博上就可以松松搜到,小編就不再贅述啦。
  • 萬萬沒想到,Python竟能繪製出如此酷炫的三維圖
    作者 | Jay Alammar轉載自 | 高級農民工通常我們用 Python 繪製的都是二維平面圖,但有時也需要繪製三維場景圖,比如像下面這樣的:這些圖怎麼做出來呢?今天就來分享下如何一步步繪製出三維矢量(SVG)圖。
  • python學習路線分享
    學習python不知道如何下手,不知道要學哪些知識,看完下面這些你就知道了。把下面的知識學完,就是一個合格的「捕蛇」者了。目錄基礎知識學習(MOOC嵩天+零散知識) 無基礎不能高樓,合抱之木,生於毫末,九層之臺,起於累土 1.1 Python MOOC練習3 1.2 Python MOOC練習4 1.3 python