# 新冠疫情可视化-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() # 查看数据前五行
```

### 3. 数据处理
**首先我们提取全国各省目录,并获取其确诊总人数列表,将最近的日期放在列表最前面,并识别统计零新增数据。**
```
df_province = data.loc[(data['province'].notnull()) & (data['city'].isnull())] # 筛选各省数据
name = ['湖北','广东','北京','吉林','上海','浙江','安徽','江西','山东','广西','海南','四川','贵州',
'云南','宁夏','天津','山西','黑龙江','河南','湖南','重庆','河北','辽宁','江苏','福建',
'陕西','台湾','香港','澳门','内蒙','甘肃','新疆','青海','西藏'] # 各省简称列表,方便文字展示
```

**对其表格省份名称进行简化:**
```
def transfer(x):
for i in name:
if i[:2] == x[:2]:
return i
df_province['pro'] = df_province['province'].apply(transfer) # 新增省份简称一列
df_province.drop('province', axis=1, inplace=True) # 删除原始省份列
df_province.to_csv('china_province_data.csv',index=0) # 结果表保存
```

**然后获取其确诊总人数列表,匹配各省及其确诊相关数据。**
```
province_list = df[df['date']=='2020-09-21']['pro'].tolist() # 各省/区的名字列表
data_list = df[df['date']=='2020-09-21']['confirmed'].tolist() # 数据
data_pair = [x for x in zip(province_list, data_list)]
```
## 四、地图绘制流程
### 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='1600px', height='900px')
)
```
### 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(
series_name="",
data_pair=data_pair,
maptype="china",
label_opts=opts.LabelOpts(
is_show=True,
position='inside',
),
is_map_symbol_show=False,
)
```
### 3. 全局参数设置
**首先导入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_left="center",
pos_top="20",
title_textstyle_opts=opts.TextStyleOpts(
font_size=24,
font_family="Microsoft YaHei"),
subtitle='统计时间截止至2020.09.21 21时',
subtitle_textstyle_opts=opts.TextStyleOpts(
font_size=12, font_family="Microsoft YaHei"),
),
# 设置提示框
tooltip_opts=opts.TooltipOpts(
is_show=True,
formatter="{b} : 确诊{c}人",
),
# 设置视觉映射
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': 499, 'min': 100, 'label': '100-499', 'color': '#EE3B3B'},
{'max': 999, 'min': 500, 'label': '500-999', 'color': '#CD2626'},
{'max': 4999, 'min': 1000, 'label': '1000-4999', 'color': '#EE2C2C'},
{'max': 9999, 'min': 5000, 'label': '5000-9999', 'color': '#FF3030'},
{'max': 49999, 'min': 10000, 'label': '10000-49999', 'color': '#B22222'},
{'max': 99999, 'min': 50000, 'label': '>=50000', 'color': '#8b1A1A'}
]
)
)
```
### 4. 可视化效果
**我们上述代码整合,可以看到地图的效果。**

评论(0)

暂无数据