基于Python绘制世界疫情地图详解
随着新冠疫情的爆发和扩散,许多人都对世界各国间的疫情数据进行了关注。对于数据分析人员或者是Python程序员而言,将这些数据可视化的工具和技巧就显得尤为重要了。在本篇文章中,我将为大家介绍如何使用Python绘制世界疫情地图,并详细解释实现方法。
1. 数据获取和预处理
首先我们需要获取一个可靠的世界疫情的数据源,这里我们使用全球疫情实时数据接口 API (https://lab.isaaclin.cn/nCoV/api/overall)来获取数据。该网站每 10 分钟更新一次数据,数据包含各个省份和国家的确诊、治愈、死亡等数据。
import requests import json url = "https://lab.isaaclin.cn/nCoV/api/overall" response = requests.get(url) data = json.loads(response.text) world_data = data["results"]
在获取数据之后,我们需要完成数据的预处理。这里我们使用 pandas 库来处理数据,可以方便地进行数据分析和预处理。
import pandas as pd
cols = ["confirmedCount", "deadCount", "curedCount", "provinceName", "countryName"]
data_list = []
for i in world_data:
if i["countryName"] == "中国":
data_list.extend(i["cities"])
data_list[-1]["countryName"] = i["countryName"]
else:
data_list.append(i)
df = pd.DataFrame(data_list)[cols]
df = df.reset_index(drop=True)
df.fillna(0)
这里我们获取目前为止的确诊、死亡、治愈人数、省份和国家名称数据,之后将国家和地区数据合并。由于在数据源中一些条目数据不完整,我们需要先通过 fillna 填充缺失的数据,并将空数据转为0。
2. 数据可视化
当我们成功获取并处理好数据之后,就可以着手进行数据的地理可视化了。这里我们使用 folium 库实现。它是一个基于 Python 编写的开源地图库,方便使用且美观。
!pip install folium import folium from folium.plugins import HeatMap world_map = folium.Map(location=[30, 0], zoom_start=2) HeatMap(df[["confirmedCount", "deadCount", "curedCount"]]).add_to(world_map) world_map
我们首先需要创建一个 Map 对象,即地图。由于数据涉及的国家较多,我们设置初始地图的中心为(30, 0),缩放级别为2。接着使用 HeatMap 来制作热力图,使用 add_to 将它加入到我们之前创建的地图中。最后打印该地图,即可得到如下结果:
[](https://i.loli.net/2021/10/25/lo7w2QZgJyGiHeV.png)
热力图非常好地展示了全球疫情数据,使人能够更直观地了解疫情的情况。我们还可以添加鼠标悬停时的弹出窗口,让地图更加人性化:
world_map = folium.Map(location=[30, 0], zoom_start=2)
def add_popup(row):
return folium.Popup("国家/地区: {}<br>确诊: {}<br>死亡: {}<br>治愈: {}".format(\
row["countryName"], row["confirmedCount"], row["deadCount"], row["curedCount"]), max_width=200)
for idx, row in df.iterrows():
folium.CircleMarker(location=[row['latitude'], row['longitude']],
radius=5,
popup=add_popup(row),
fill_color="#3db7e4", # divvy color
).add_to(world_map)
world_map
我们在地图上添加 CircleMarker 圆形标注,并且为其添加弹出窗口,可以在鼠标悬停时弹出各个国家和地区的详细信息。popu是弹出提示框,iterrows() 方法逐行遍历所读取的数据,返回了一行数据对应的索引和数据。
[](https://i.loli.net/2021/10/25/ZGNdXl89CjW1gJk.png)
3. 提高交互性
我们还可以增加互动元素来提高地图的可读性。这里我们使用 folium 自带的 LayerControl 类,允许用户可以切换不同的图层。
world_map = folium.Map(location=[30, 0], zoom_start=2)
heat = HeatMap(df[["confirmedCount", "deadCount", "curedCount"]], name="疫情热力图")
marker_layer = folium.FeatureGroup(name="标注层")
def add_popup(row):
return folium.Popup("国家/地区: {}<br>确诊: {}<br>死亡: {}<br>治愈: {}".format(\
row["countryName"], row["confirmedCount"], row["deadCount"], row["curedCount"]), max_width=200)
for idx, row in df.iterrows():
folium.CircleMarker(location=[row['latitude'], row['longitude']],
radius=5,
popup=add_popup(row),
fill_color="#3db7e4", # divvy color
).add_to(marker_layer)
marker_layer.add_to(world_map)
folium.LayerControl().add_to(world_map)
heat.add_to(world_map)
world_map
我们分别为热力图和标注层赋予不同的名称,使用 FeatureGroup 类创建了标注层,并添加了 CircleMarker 圆形标注。之后将标注层添加到地图中,并为地图添加 LayerControl。 LayerControl 可以方便地实现切换图层的功能,让用户可以根据需要选择查看不同的视图。
[](https://i.loli.net/2021/10/25/WLPIyGrbvh8VFto.png)
在本篇文章中,我们基于全球疫情实时数据接口 API 和 Python 中 folium 库,实现了世界疫情的可视化。我们使用 HeatMap 和 CircleMarker 分别实现了疫情热力图和标注层,并在标注层中加入了弹出窗口,提高了地图的互动性。最后,我们还添加了 LayerControl 类,让用户可以方便地切换图层。
