1. 疫情图简介
随着新型冠状病毒的爆发,人们开始关注疫情的实时情况。疫情图就是一种用于展示疫情数据的图表形式,可以直观地表示疫情的传播趋势和分布情况。
在疫情图中,通常会使用地图、折线图、条形图等形式呈现,同时也可以根据数据的不同维度进行分类展示,例如按照国家、省份、城市等划分。作为一种重要的数据可视化工具,疫情图在全球新冠疫情期间得到了广泛的应用。
2. 绘制疫情地图
2.1 准备工作
绘制疫情地图需要用到Python中的一些常用库,包括pandas、matplotlib、geopandas等。其中,geopandas库是用于地理数据处理的常用库,可以方便地处理地图数据并进行可视化。
首先需要安装需要的库,可以使用pip工具进行安装,如下所示:
pip install pandas matplotlib geopandas
安装完成后,需要准备地图数据和疫情数据。
这里以全球疫情地图为例,使用GeoJSON格式的地图数据和CSV格式的疫情数据。可以从各种公开数据源中获取这些数据,例如百度迁徙、腾讯疫情实时追踪等。
地图数据一般包含地图边界和各个区域的属性信息,如下所示:
{
"type":"Feature",
"properties":{
"NAME":"United States",
"ISO_A3":"USA",
"CONTINENT":"North America",
"SUBREGION":"Northern America"
},
"geometry":{
"type":"Polygon",
"coordinates":[
[...]
]
}
}
而疫情数据则包含各个地区的相关信息,例如确诊人数、死亡人数、治愈人数等,如下所示:
{
"provinceName":"湖北省",
"provinceShortName":"湖北",
"confirmedCount":67800,
"suspectedCount":0,
"curedCount":62826,
"deadCount":4512
}
这里的数据是从腾讯疫情实时追踪中获取的。
2.2 数据预处理
在开始绘制疫情地图之前,需要对数据进行预处理,使其符合绘制要求,并且方便地进行处理。
首先需要将地图数据和疫情数据进行合并,以便在地图上绘制疫情数据。这里可以使用pandas库中的merge方法实现。
import pandas as pd
# 读取地图数据
world = pd.read_json('world.json')
# 读取疫情数据
data = pd.read_csv('data.csv')
# 合并数据
merged_data = pd.merge(world, data, left_on='NAME', right_on='provinceName')
print(merged_data.head())
合并完成后,数据的格式如下所示:
{
"type":"Feature",
"properties":{
"NAME":"United States",
"ISO_A3":"USA",
"CONTINENT":"North America",
"SUBREGION":"Northern America",
"provinceName":"美国",
"provinceShortName":"美国",
"confirmedCount":31383830,
"suspectedCount":0,
"curedCount":0,
"deadCount":562568
},
"geometry":{
"type":"Polygon",
"coordinates":[
[...]
]
}
}
接下来需要对数据进行清洗和处理,以适配地图的绘制要求。这里需要对一些字段进行处理,例如将确诊人数进行分段操作,以便在地图上进行着色。同时还可以对一些字段进行筛选,以便在绘制地图时只关注特定的数据。
import numpy as np
import geopandas as gpd
# 筛选部分需要的数据
merged_data = merged_data.loc[:, ['NAME', 'geometry', 'confirmedCount']]
# 对确诊人数进行分段处理
bins = [0, 1000, 10000, 100000, 1000000, np.inf]
labels = ['0-1k', '1k-10k', '10k-100k', '100k-1m', '1m+']
merged_data['confirmedCount'] = pd.cut(merged_data['confirmedCount'], bins=bins, labels=labels)
# 将数据转化为地理对象
merged_data = gpd.GeoDataFrame(merged_data)
print(merged_data.head())
处理后的数据格式如下所示:
{
"type":"Feature",
"properties":{
"NAME":"United States",
"confirmedCount":"10k-100k"
},
"geometry":{
"type":"Polygon",
"coordinates":[
[...]
]
}
}
2.3 地图绘制
数据预处理完成后,就可以开始绘制地图了。这里使用geopandas库的plot方法进行绘制。
import matplotlib.pyplot as plt
# 绘制地图
merged_data.plot(column='confirmedCount', cmap='OrRd', linewidth=0.8, edgecolor='white', legend=True)
# 去除坐标轴
plt.axis('off')
# 添加标题
plt.title('Global Confirmed Cases')
# 显示地图
plt.show()
绘制后的地图如下所示:
3. 绘制疫情折线图
3.1 折线图简介
除了地图形式的疫情图,还可以使用折线图等形式展现疫情的变化趋势。
折线图是一种常用的数据可视化形式,可以用于展示各种类型的时间序列数据。在疫情图中,折线图一般用于表示疫情数据随时间的变化趋势,如确诊人数、治愈人数和死亡人数等。
3.2 绘制折线图
在绘制折线图之前,同样需要进行数据预处理,包括数据清洗、格式转换等操作。这里以中国疫情数据为例,使用CSV格式的数据文件。
首先需要读取CSV文件并进行简单的格式转换,如下所示:
import pandas as pd
# 读取疫情数据
data = pd.read_csv('data.csv')
# 转换日期格式
data['date'] = pd.to_datetime(data['date'])
# 筛选中国地区数据
data_china = data[data['provinceName'] == '中国']
# 获取全国的疫情数据
total_data = data_china.groupby('date')['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum().reset_index()
print(total_data.head())
读取和转换完成后,数据格式如下所示:
{
"date":"2021-04-11",
"confirmedCount":101931,
"suspectedCount":0,
"curedCount":95073,
"deadCount":4841
}
接下来使用matplotlib库进行绘图。首先需要创建一个画布和子图,然后调用plot方法绘制折线图。
import matplotlib.pyplot as plt
# 创建画布和子图
fig, ax = plt.subplots(figsize=(10, 6))
# 绘制折线图
ax.plot(total_data['date'], total_data['confirmedCount'], label='confirmed', lw=2)
ax.plot(total_data['date'], total_data['curedCount'], label='cured', lw=2)
ax.plot(total_data['date'], total_data['deadCount'], label='dead', lw=2)
# 添加标题和标签
ax.set_title('China COVID-19 Cases')
ax.set_xlabel('Date')
ax.set_ylabel('Cases')
ax.legend()
# 显示图形
plt.show()
绘制后的折线图如下所示:
4. 总结
在这篇文章中,我们介绍了Python如何绘制疫情图的方法和步骤。疫情图是一种重要的数据可视化工具,可以将疫情数据进行直观、清晰地展示,方便了人们对疫情的了解和掌握。
其中,地图形式的疫情图可以使用geopandas库方便地处理地图数据,并进行可视化展示;折线图形式的疫情图可以使用matplotlib库进行绘制,对于疫情数据随时间的变化趋势有非常好的呈现效果。
如果您对数据可视化感兴趣,可以尝试使用Python进行更多类型的图表绘制和数据处理。