欢迎访问宙启技术站
智能推送

基于Python绘制世界疫情地图详解

发布时间:2023-05-17 21:01:10

随着新冠疫情的爆发和扩散,许多人都对世界各国间的疫情数据进行了关注。对于数据分析人员或者是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 将它加入到我们之前创建的地图中。最后打印该地图,即可得到如下结果:

[![world_map.png](https://i.loli.net/2021/10/25/lo7w2QZgJyGiHeV.png)](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() 方法逐行遍历所读取的数据,返回了一行数据对应的索引和数据。

[![world_map1.png](https://i.loli.net/2021/10/25/ZGNdXl89CjW1gJk.png)](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 圆形标注。之后将标注层添加到地图中,并为地图添加 LayerControlLayerControl 可以方便地实现切换图层的功能,让用户可以根据需要选择查看不同的视图。

[![world_map2.png](https://i.loli.net/2021/10/25/WLPIyGrbvh8VFto.png)](https://i.loli.net/2021/10/25/WLPIyGrbvh8VFto.png)

在本篇文章中,我们基于全球疫情实时数据接口 API 和 Python 中 folium 库,实现了世界疫情的可视化。我们使用 HeatMapCircleMarker 分别实现了疫情热力图和标注层,并在标注层中加入了弹出窗口,提高了地图的互动性。最后,我们还添加了 LayerControl 类,让用户可以方便地切换图层。