如何使用 Python 绘制 COVID-19 的全球扩散图,


如何使用 Python 绘制 COVID-19 的全球扩散图

使用这些开源框架创建一个彩色地图,显示病毒的可能的传播路径。

对于一个全球旅行司空见惯的世界来说,疾病的传播是一个真正令人担忧的问题。一些组织会跟踪重大的流行病(还有所有普遍的流行病),并将他们的跟踪工作获得的数据公开出来。不过,这些原始的数据对人来说可能很难处理,这就是为什么数据科学如此重要的原因。比如,用 Python 和 Pandas 可视化 COVID-19 在全球范围内的传播路径可能对这些数据的分析有所帮助。

最开始,当面对如此大数量的原始数据时可能难以下手。但当你开始处理数据之后,慢慢地就会发现一些处理数据的方式。下面是用于处理 COVID-19 数据的一些常见的情况:

第一步:Corona 数据

从下面这个网站上下载最新的 corona 数据(LCTT 译注:2020-12-14 仍可访问,有墙):

  • https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv

我们之间将这个下载好的数据载入为 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)包括以下几列数据:

之后还可以看到 Date 这一列包含了从 1 月 22 日到 3 月 31 日的条目信息。这个数据是每天更新的,所以你会得到你当天的值。

第二步:清理和修改 DataFrame

我们要往这个 DataFrame 中增加一列数据,就是那个包含了 ISO 3 编码。可以通过以下三步完成这个任务:

第三步:使用 Plotly 可视化传播路径

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. 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 图的不错的资源。

相关内容