如何使用 Python 繪製 COVID-19 的全球擴散圖

2020-12-22 51CTO

使用這些開源框架創建一個彩色地圖,顯示病毒的可能的傳播路徑。

對於一個全球旅行司空見慣的世界來說,疾病的傳播是一個真正令人擔憂的問題。一些組織會跟蹤重大的流行病(還有所有普遍的流行病),並將他們的跟蹤工作獲得的數據公開出來。不過,這些原始的數據對人來說可能很難處理,這就是為什麼數據科學如此重要的原因。比如,用 Python 和 Pandas 可視化 COVID-19 在全球範圍內的傳播路徑可能對這些數據的分析有所幫助。

最開始,當面對如此大數量的原始數據時可能難以下手。但當你開始處理數據之後,慢慢地就會發現一些處理數據的方式。下面是用於處理 COVID-19 數據的一些常見的情況:

  1. 從 GitHub 上下載 COVID-19 的國家每日傳播數據,保存為一個 Pandas 中的 DataFrame 對象。這時你需要使用 Python 中的 Pandas 庫。
  2. 處理並清理下載好的數據,使其滿足可視化數據的輸入格式。所下載的數據的情況很好(數據規整)。這個數據有一個問題是它用國家的名字來標識國家,但最好是使用三位數的 ISO 3 碼(國家代碼表)來標識國家。為了生成 ISO 3 碼,可是使用 pycountry 這個 Python 庫。生成了這些代碼之後,可以在原有的 DataFrame 上增加一列,然後用這些代碼填充進去。
  3. 最後為了實現可視化,使用 Plotly 庫中的 express 模塊。這篇文章是使用名為choropleth 的地圖(可在 Plotly 庫中獲得)來可視化該疾病在全球的傳播。

從下面這個網站上下載最新的 corona 數據(LCTT 譯註:2020-12-14 仍可訪問,有牆):

我們之間將這個下載好的數據載入為 Pandas 的 DataFrame。Pandas 提供了一個函數, read_csv(),可以直接使用 URL 讀取數據,並返回一個 DataFrame 對象,具體如下所示:

  1. import pycountry
  2. import plotly.express as px
  3. import pandas as pd
  4. URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'
  5. df1 = pd.read_csv(URL_DATASET)
  6. print(df1.head(3))  # Get first 3 entries in the dataframe
  7. print(df1.tail(3))  # Get last 3 entries in the dataframe

在 Jupyter 上的輸出截圖:

Jupyter screenshot

從這個輸出可以看到這個 DataFrame(df1)包括以下幾列數據:

  1. Date
  2. Country
  3. Confirmed
  4. Recovered
  5. Dead

之後還可以看到 Date 這一列包含了從 1 月 22 日到 3 月 31 日的條目信息。這個數據是每天更新的,所以你會得到你當天的值。

我們要往這個 DataFrame 中增加一列數據,就是那個包含了 ISO 3 編碼。可以通過以下三步完成這個任務:

  1. 創建一個包含所有國家的列表。因為在 df1 的 Country 列中,國家都是每個日期就重複一次。所以實際上 Country 列中對每個國家就會有多個條目。我使用 unique().tolist() 函數完成這個任務。
  2. 我使用 d_country_code 字典對象(初始為空),然後將其鍵設置為國家的名稱,然後它的值設置為其對應的 ISO 3 編碼。
  3. 我使用 pycountry.countries.search_fuzzy(country) 為每個國家生成 ISO 3 編碼。你需要明白的是這個函數的返回值是一個 Country 對象的列表。我將這個函數的返回值賦給 country_data 對象。以這個對象的第一個元素(序號 0)為例。這個 \ 對象有一個 alpha_3 屬性。所以我使用 country_data[0].alpha_3 就能「獲得」第一個元素的 ISO 3 編碼。然而,在這個 DataFrame 中有些國家的名稱可能沒有對應的 ISO 3 編碼(比如有爭議的領土)。那麼對這些「國家/地區」,我就用一個空白字符串來替代 ISO 3 編碼。你也可以用一個 try-except 代碼來替換這部分。except 中的語句可以寫:print(『could not add ISO 3 code for ->', country)。這樣就能在找不到這些「國家/地區」對應的 ISO 3 編碼時給出一個輸出提示。實際上,你會發現這些「國家/地區」會在最後的輸出中用白色來表示。
  4. 在獲得了每個國家的 ISO 3 編碼(有些是空白字符串)之後,我把這些國家的名稱(作為鍵)還有國家對應的 ISO 3 編碼(作為值)添加到之前的字典 d_country_code 中。可以使用 Python 中字典對象的 update() 方法來完成這個任務。
  5. 在創建好了一個包含國家名稱和對應 ISO 3 編碼的字典之後,我使用一個簡單的循環將他們加入到 DataFrame 中。

choropleth 地圖是一個由彩色多邊形組成的地圖。它常常用來表示一個變量在空間中的變化。我們使用 Plotly 中的 px 模塊來創建 choropleth 圖,具體函數為:px.choropleth

這個函數的所包含的參數如下:

  1. plotly.express.choropleth(data_frame=None, lat=None, lon=None, locations=None, locationmode=None, geojson=None, featureidkey=None, color=None, hover_name=None, hover_data=None, custom_data=None, animation_frame=None, animation_group=None, category_orders={}, labels={}, color_discrete_sequence=None, color_discrete_map={}, color_continuous_scale=None, range_color=None, color_continuous_midpoint=None, projection=None, scope=None, center=None, title=None, template=None, width=None, height=None)

choropleth() 這個函數還有幾點需要注意:

  1. geojson 是一個 geometry 對象(上面函數第六個參數)。這個對象有點讓人困擾,因為在函數文檔中沒有明確地提到這個對象。你可以提供,也可以不提供 geojson 對象。如果你提供了 geojson 對象,那麼這個對象就會被用來繪製地球特徵,如果不提供 geojson 對象,那這個函數默認就會使用一個內建的 geometry 對象。(在我們的實驗中,我們使用內建的 geometry 對象,因此我們不會為 geojson 參數提供值)
  2. DataFrame 對象有一個 data_frame 屬性,在這裡我們先前就提供了一個我們創建好的df1
  3. 我們用 Confirmed(確診數)來決定每個國家多邊形的顏色。
  4. 最後,我們 Date 列創建一個 animation_frame。這樣我們就能通過日期來劃分數據,國家的顏色會隨著 Confirmed 的變化而變化。

最後完整的代碼如下:

  1. import pycountry
  2. import plotly.express as px
  3. import pandas as pd
  4. # ----------- Step 1 ------------
  5. URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'
  6. df1 = pd.read_csv(URL_DATASET)
  7. # print(df1.head) # Uncomment to see what the dataframe is like
  8. # ----------- Step 2 ------------
  9. list_countries = df1['Country'].unique().tolist()
  10. # print(list_countries) # Uncomment to see list of countries
  11. d_country_code = {} # To hold the country names and their ISO
  12. for country in list_countries:
  13. try:
  14. country_data = pycountry.countries.search_fuzzy(country)
  15. # country_data is a list of objects of class pycountry.db.Country
  16. # The first item ie at index 0 of list is best fit
  17. # object of class Country have an alpha_3 attribute
  18. country_code = country_data[0].alpha_3
  19. d_country_code.update({country: country_code})
  20. except:
  21. print('could not add ISO 3 code for ->', country)
  22. # If could not find country, make ISO code ' '
  23. d_country_code.update({country: ' '})
  24.  
  25. # print(d_country_code) # Uncomment to check dictionary
  26.  
  27. # create a new column iso_alpha in the df
  28. # and fill it with appropriate iso 3 code
  29. for k, v in d_country_code.items():
  30. df1.loc[(df1.Country == k), 'iso_alpha'] = v
  31.  
  32. # print(df1.head) # Uncomment to confirm that ISO codes added
  33. # ----------- Step 3 ------------
  34. fig = px.choropleth(data_frame = df1,
  35. locations= "iso_alpha",
  36. color= "Confirmed", # value in column 'Confirmed' determines color
  37. hover_name= "Country",
  38. color_continuous_scale= 'RdYlGn', # color scale red, yellow green
  39. animation_frame= "Date")
  40.  
  41. fig.show()

這段代碼的輸出就是下面這個圖的內容:

Map

你可以從這裡下載並運行完整代碼。

最後,這裡還有一些關於 Plotly 繪製 choropleth 圖的不錯的資源。

【責任編輯:

龐桂玉

TEL:(010)68476606】

點讚 0

相關焦點

  • 用Python繪製一套「會跳舞」的動態圖形
    如何讓目標聽眾更直觀地理解?當然是將數據可視化啊,最而且好的英文動態可視化。本文將以線型圖,條形圖和餅圖為例,系統地講解如何讓你的數據圖表動起來。如果是首次接觸,您可以將這個函數簡單地理解為一個,同時循環,不停地在「畫布」上重新放置目標數據圖。如何使用FuncAnimation?
  • 全球、地區和國家對covid-19疫苗接種目標人群規模的估計
    全球、地區和國家對covid-19疫苗接種目標人群規模的估計 作者:小柯機器人 發布時間:2020/12/18 21:35:00 復旦大學餘宏傑團隊研究了全球、地區和國家對covid-19疫苗接種目標人群規模的估計。
  • 幾行代碼完成動態圖表繪製|Python實戰
    作者 | 小F來源 | 法納斯特頭圖 | CSDN下載自視覺中國關於動態條形圖,小F以前推薦過「Bar Chart Race」這個庫。三行代碼就能實現動態條形圖的繪製。最近小F又發現一個可視化圖庫「Pandas_Alive」,不僅包含動態條形圖,還可以繪製動態曲線圖、氣泡圖、餅狀圖、地圖等。同樣也是幾行代碼就能完成動態圖表的繪製。安裝版本建議是0.2.3,matplotlib版本是3.2.1。
  • 3種方法學會python模塊使用,3分鐘直接上手一個python繪圖程序
    013種方式查看python模塊使用,使用turtle模塊完成第一個繪畫程序程式語言是一種工具,工具就是為了解決問題,我們的學習模式三種查看模塊下具有哪些函數的方法:1、在python代碼編輯器中,使用模塊加"."
  • 不再羨慕別人的漂亮圖表,一文學會如何用Python繪製堆積圖
    好啦,廢話少說,前幾次已經和大家詳細聊了matplotlib庫中用於繪製圖表的幾個經典函數,今天咱們繼續聊聊哦,那今天聊點什麼內容呢?就聊點深入一些的組合式圖形吧,咱們來討論一下如何繪製經典的堆積圖哦!好啦,那就開始吧!
  • 在Python中使用Pandas
    Pandas是一個python庫,用於處理數據、生成統計數據、聚合數據等等。在這篇文章中,我們將討論如何使用Pandas庫進行數據選擇、聚合和統計分析。我們開始吧!我們將使用銀行客戶流失建模數據集。數據可以在這裡找到。
  • 非分裂式餅圖你會繪製嗎?一文學會如何用Python搞定
    數據可視化是現今大數據時代的必備技能,Python作為數據可視化的寵兒,得益於其編程靈活和上手快等特點已被很多開發人員使用,而在Python數據可視化當中,matplotlib庫是最為常用和經典的二維可視化庫,關於使用matplotlib庫中繪製圖表相關的函數咱們已經介紹過多個,上次咱們已經聊過在Python中如何使用matplotlib庫中的pie
  • 日本的吉祥物和妖怪能打敗COVID-19嗎?
    儘管這個吉祥物是在covid-19爆發之前就已經有了,但也許現在才是它應該擁有的真正的高光時刻。圖片sup.go.jpQuaran的整體形狀類似於字母「Q」。它的目的主要是為了促進衛生、勞動和福利部轄下的檢疫信息工作。圖中,Quaran的護目鏡可幫助發現傳染病,禁止進口食物和其他違法行為,而盾牌是為保護日本公民免受危險物而製成的。
  • Python用PyQt5繪製多彩隨機散點圖,基本控制項之QPainter使用詳解
    如何通過Qt界面設置字體屬性,Python中PyQt5的QFontDialog類詳解,該類為大部分圖形界面提供了高度優化的函數,使用該類可以用少量的代碼繪製一些複雜的圖形,比如餅圖等一些常用的數據統計圖。
  • python matplotlib畫圖教程學習:使用介紹
    本篇文章介紹matplotlib包使用時,需要掌握的一些基本概念。除了圖中顯示的紅藍線型圖和散點圖,matplotlib還能繪製柱形圖、燭型圖、餅圖、3D圖形等等各種個性化圖形,將在後續文章一一介紹。matplotlib圖形的幾個主要對象:Figure對象整個圖形即是一個Figure對象。Figure對象至少包含一個子圖,也就是Axes對象。
  • 如何使用Visual Studio工具創建python項目
    python一般情況下,我們使用Visual Studio進行C#、C++和C語言項目進行開發。隨著工具不斷完善,現在也可以進行python項目開發了。那麼,如何在Visual Studio 2019工具上創建python項目?操作步驟:1、通過快捷方式或電腦開始菜單,雙擊打開Visual Studio 2019工具
  • 在疫情初期,預印本對全球論述COVID-19傳播能力的影響
    預印本研究對當前COVID-19疫情討論與決策的影響表明:我們必須重新思考,在當前和未來的公共衛生緊急情況下,如何獎勵和認可科學共同體的貢獻。 自WHO於2020年1月5日首次通報2019冠狀病毒病(COVID-19)以來,中國境內COVID-19 確診病例已超過80,000例,截至2020年3月6日,疫情已蔓延至全球近90個國家[1]。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07
  • Covid-19和季節性流感相比患者器官功能衰竭和死亡風險顯著增加
    為了比較檢查因Covid-19和季節性流感而住院的患者之間臨床表現和死亡風險的差異,研究組在美國退伍軍人事務所進行了一項隊列研究。 研究組招募了2020年2月1日至6月17日間的3641例covid-19住院患者,和2017至2019年間12676例季節性流感住院患者,主要觀察指標為臨床表現、醫療資源使用以及死亡的風險。
  • 如何部署Jupyter Notebook用於交互式Python開發?
    如果沒有,可以使用單個命令來添加它:sudo apt-get install python3 -y 接下來,我們需要安裝一個軟體,該軟體允許您使用以下命令為Python創建虛擬環境:>sudo apt-get install python3-venv -y 最後,我們必須使用以下命令安裝PIP(用於安裝Python軟體包的工具):sudo apt-get install python3-pip -y
  • 慢步python,你苦苦找尋的python中文使用手冊在哪裡?這裡有答案
    #學習難度大python對大家來說,應該算是相對新的程式語言。即使這樣,我們學習python的道路依舊困難重重。問題在,相關的學習資料不夠系統。初學者使用手冊像以前剛開始使用電視、手機一樣,都有一本使用說明書,即使用手冊。
  • 如何使用AI繪製一個圓環?如何繪製有立體感的圖形?
    使用AI工具來繪製一個圓環就必須使用路徑查找器中的分割命令,下面來看看如何操作吧!1.我們製作圓環之前先要畫出一個正圓來。2.Ctrl加c,然後Ctrl加f原位複製圓形。7.在空白處點擊一下,選中中間的圓形刪除就可以完成繪製了。AI製作立體感的圖形必須要添加一些陰影,不過有一些簡單的方法,下面來看看如何製作立體感的圖形吧。1.我們要將圖中的圓環製作一個立體的感覺。
  • 接種過疫苗後是否還會傳播COVID-19?
    尚不清楚COVID-19疫苗是否能防止接種疫苗的人攜帶新型冠狀病毒而不會感到不適和不知不覺地將其傳播給他人。對於接種疫苗的人掩蓋其仍然很重要。On December 18, the U.S. Food and Drug Administration authorized the emergency use of Moderna's covid-19 vaccine.
  • 使用單行代碼評估回歸模型的Python包
    對此的一個內聯嘗試是python包「 regressormetricgraphplot」的開發,該軟體包旨在幫助用戶使用單行代碼繪製評估指標圖,以針對不同的廣泛使用的回歸模型指標進行一目了然的比較。使用該實用程序包,還可以通過將其應用於日常的預測回歸問題,顯著降低從業人員以業餘方式評估不同機器學習算法的障礙。
  • 一文講透,帶你學會用Python繪製帶誤差棒的柱狀圖和條形圖
    咱們一起探討一下如何在Python中繪製帶誤差棒的柱狀圖和條形圖吧!首先,先來探討一下如何在Python中繪製帶誤差棒的柱狀圖直接舉個「慄子」咱們來直觀的感受一下如何進行繪製:看到了嗎,上面方框中就是生成帶誤差棒的柱狀圖的關鍵代碼,可以看出要想在柱狀圖中加入誤差棒,就需要在函數bar()中使用其關鍵字參數yerr或xerr,其對於誤差棒的屬性及屬性值是由關鍵字error_kw進行實現的,在上面程序的第17行咱們分別設置了誤差棒的線寬