# 新冠疫情可视化-Pyecharts全球地图
## 一、案例背景
**本案例就新冠疫情历史数据,利用Matplotlib、Pyecharts绘图工具展现疫情数据在全国以及全球范围内的统计信息,供大家学习参考。**
## 二、数据来源
**本案例的数据来源于**[https://github.com/canghailan/Wuhan-2019-nCoV](https://github.com/canghailan/Wuhan-2019-nCoV)中的Wuhan-2019-nCoV.csv文件。由新冠病毒爆发初期截止至2020年9月21日历史数据作为样本。
## 三、全球疫情确诊人数-地图
### 1. Pyecharts地图
**Pyecharts是一个用于生成Echarts图表的库。Echarts 是百度开源的一个数据可视化JS库用 Echarts 生成的图可视化效果非常棒,用Pyecharts 可以很方便在 Python 中直接使用数据,来生成图表。**
**在最新的Pyecharts中,我们需要自行安装对应的地图文件包。**
**地理文件被分为了三个包,分别是:**
```
全球国家地图: echarts-countries-pypkg
中国省级地图: echarts-china-provinces-pypkg
中国市级地图: echarts-china-cities-pypkg
```
**需要哪个地图,可以直接用pip来进行安装:**
```
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
pip install echarts-china-counties-pypkg
pip install echarts-china-misc-pypkg
pip install echarts-united-kingdom-pypkg
```
* **全球国家地图: **`echarts-countries-pypkg` :世界地图和 213 个国家,包括中国地图
* **中国省级地图: **`echarts-china-provinces-pypkg`:23 个省,5 个自治区
* **中国市级地图: **`echarts-china-cities-pypkg`:370 个中国城市
* **中国县区级地图: **`echarts-china-counties-pypkg`:2882 个中国县·区
* **中国区域地图: **`echarts-china-misc-pypkg`:11 个中国区域地图,比如华南、华北
**Pyehcarts共有有四种地理图表,**
`Map`:地图
`Geo`:地理坐标系
`BMap`:百度地图**
**百度地图需要申请开发者 AK。这里不做细说,大家有兴趣可以去Pyecharts官网学习。
`Map3D`:三维地图
### 2. 数据准备
**首先我们导入相关的Python库:**
```
import numpy as np # 科学计算库
import pandas as pd # 数据处理库
import matplotlib.pyplot as plt # matplotlib可视化库
plt.rcParams['font.family']='Arial Unicode MS' # 显示中文参数【本代码基于OS系统,若为windows系统则将字体改为SimHei即可】
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.commons.utils import JsCode
import warnings
warnings.filterwarnings('ignore') # 忽略警告
```
**这里我们直接使用下载好的数据文件进行数据读取:**
```
data = pd.read_csv('cov.txt')
data.head() # 查看数据前五行
```
![image20221114102308720.png](/z_anli/upload/pgc/202212/cce44a3e3944d48294bd1bf8fcb95afc.png)
### 3. 数据处理
**首先我们提取全球国家目录,并获取其确诊总人数列表,将最近的日期放在列表最前面,并识别统计零新增数据。**
```
# 定位到最近日期然后筛选国家
data = data.loc[(data['date'] == '2020-09-21') & (data['province'].isnull())]
data.head()
```
![image20221114102520432.png](/z_anli/upload/pgc/202212/5e97d379c5781bb6d571e6afae4620ca.png)
**然后获取其确诊总人数列表,匹配各个国家及其确诊相关数据。**
```
country = data['country'].tolist() # 国家
confirmed = data['confirmed'].tolist() # 确诊人数
cure = data['cured'].tolist() # 治愈人数
death = data['dead'].tolist() # 死亡人数
data_pair = [(i, (j, x, y)) for i, j, x, y in zip(country, confirmed, cure, death)]
data_pair
```
![image20221114102604930.png](/z_anli/upload/pgc/202212/77f602c616f6b87ebfe65afa041d308f.png)
## 四、全球地图绘制流程
### 1. 初始化配置
```
class Map(
# 初始化配置项,参考 `global_options.InitOpts`
init_opts: opts.InitOpts = opts.InitOpts()
)
```
**根据规则,我们可以定义绘图函数。比如设置主题背景、画布宽度和高度:**
```
def china_map(data_pair):
Map(init_opts=opts.InitOpts(theme='dark',width='2000px',height='1000px'))
```
### 2. 添加绘图参数
**我们先来看下主要的绘图参数设置规则:**
```
def add(
# 系列名称,用于 tooltip 的显示,legend 的图例筛选。
series_name: str,
# 数据项 (坐标点名称,坐标点值)
data_pair: types.Sequence[types.Union[types.Sequence, opts.MapItem, dict]],
# 地图类型,具体参考 pyecharts.datasets.map_filenames.json 文件
maptype: str = "china",
# 是否显示标记图形
is_map_symbol_show: bool = True)
```
**根据规则,我们画图的主要参数可以设置为:**
```
add(
'',
data_pair,
'world',
name_map=name_map,
is_map_symbol_show=False)
```
### 3. 系列配置项
**系列配置可以通过 **`set_series_opts` 方法进行设置,通过系列配置项,可以对文字、图元等样式进行配置。
**因为国家名称太多,为了防止文字过多而造成的可视化效果较差,我们通过将**`label_opts`进行隐藏。
```
set_series_opts(label_opts=opts.LabelOpts(is_show=False))
```
### 4. 全局参数设置
**首先导入options选项,并缩写为opts。**
`set_global_opts()`函数可设置配置项如下:
```
- title_opts——标题
- legend_opts——图例
- tooltip_opts——提示框
- toolbox_opts——工具箱
- brush_opts——区域选择组件
- xaxis_opts——X轴
- yaxis_opts——Y轴
- visualmap_opts——视觉映射
- datazoom_opts——区域缩放
- graphic_opts——原生图形元素组件
- axispointer_opts——坐标轴指示器
```
**下面我们在地图中进行相应设置:**
```
set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(
title='全球新冠疫情累计确诊人数地图',pos_right='center',pos_top='2%',
title_textstyle_opts=opts.TextStyleOpts(
font_size=24, font_family="Microsoft YaHei",),
subtitle='统计时间截止至2020.09.21',subtitle_textstyle_opts=opts.TextStyleOpts(
font_size=12, color="#CCCCCC",font_family="Microsoft YaHei"
),
),
# 设置图例
legend_opts=opts.LegendOpts(is_show=False),
# 设置视觉映射
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
dimension=0,
pos_left="10",
pos_bottom='20',
pieces=[
{'max': 9, 'min': 0, 'label': '0-9', 'color': '#EE3B3B'},
{'max': 99, 'min': 10, 'label': '10-99', 'color': '#EE3B3B'},
{'max': 999, 'min': 100, 'label': '100-999', 'color': '#EE3B3B'},
{'max': 9999, 'min': 1000, 'label': '1000-9999', 'color': '#CD2626'},
{'max': 99999, 'min': 10000, 'label': '10000-99999', 'color': '#EE2C2C'},
{'max': 999999, 'min': 100000, 'label': '100000-999999', 'color': '#FF3030'},
{'max': 4999999, 'min': 1000000, 'label': '1000000-4999999', 'color': '#B22222'},
{'max': 9999999, 'min': 5000000, 'label': '>=5000000', 'color': '#8b1A1A'}
]
),
# 设置提示框
tooltip_opts=opts.TooltipOpts(is_show=True, formatter=JsCode(mapformatter))
)
```
### 5. 可视化效果
**我们上述代码整合,调用绘制函数。**
```
draw_global_pics(data_pair)
```
**可以看到全球地图的效果:**
![image20221114103225412.png](/z_anli/upload/pgc/202212/0437727c58ce44b2793e23fe7bc09871.png)
评论(0)
暂无数据