城市设计/数据分析/技术分享/摄影记录

0%

新冠病毒疫情分析学习10-如何批量出图

本章将介绍如何批量制作疫情地图,如下图所示

示意图

准备数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 读取数据
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
# 设置不弹出警告
df = pd.read_excel('*/*/data_ncov.xlsx')

# 时间序列转换
df['date'] = df['date'].astype('str') # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date']) # 再进行时间序列转换

# 读取空间数据
china_spatial = gpd.GeoDataFrame.from_file('*/*/chinadata.json')
china_spatial.head()

一、创建函数绘制某日疫情地图

梳理一下单日疫情的出图逻辑,以气泡图为例:

  • 按照日期提取数据
  • 空间数据匹配
  • 基于某种病理情况,绘制空间气泡图

基于这个逻辑,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 创建函数绘制某日疫情地图
def create_map1(time, tp):
# 按照日期筛选数据
datai = df[df['date'] == time]
# 匹配数据
data_chinai = pd.merge(china_spatial, datai, left_on = 'name', right_on = '省市', how = 'left')
del data_chinai['name'] # 删除多余字段
# 设置图表大小及标题
plt.figure(figsize=(20,20))
# 绘制底图
data_chinai.plot(ax=plt.subplot(1,1,1),
edgecolor='k', linewidth = 0.5,
color = 'gray', alpha = 0.1)
# 添加气泡图
plt.scatter(data_chinai['centerlng'],data_chinai['centerlat'],
s = data_chinai[tp], edgecolors='k', alpha = 0.8)

# 添加省市信息
lst = data_chinai[['省市','centerlng','centerlat',tp]].to_dict(orient = 'record')
for i in lst:
plt.text(i['centerlng'], i['centerlat'], i['省市'] +':' + str(i[tp]))
# 设置标题及网格线
plt.title('%s 全国%s病例' % (time, tp), fontsize = 20)
plt.grid(True,alpha=0.5)

# 调用函数绘制某日疫情地图
create_map1('2020-1-30', '疑似')

输出结果如下:

01

二、批量出图

批量出不同日期的全国疫情地图,需要用到matplotlib的子图功能,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 重新创建函数绘制某日疫情地图,用于批量出图
def create_map2(time, tp,x,y,n):
# 按照日期筛选数据
datai = df[df['date'] == time]
# 匹配数据
data_chinai = pd.merge(china_spatial, datai, left_on = 'name', right_on = '省市', how = 'left')
del data_chinai['name'] # 删除多余字段
# 绘制底图
data_chinai.plot(ax=plt.subplot(x,y,n),
edgecolor='k', linewidth = 0.5,
color = 'gray', alpha = 0.1)
# 添加气泡图
plt.scatter(data_chinai['centerlng'],data_chinai['centerlat'],
s = data_chinai[tp], edgecolors='k', alpha = 0.8)
# 设置标题及网格线
plt.title('%s 全国%s病例' % (time, tp), fontsize = 20)
plt.grid(True,alpha=0.5)

# 调用函数绘制某日疫情地图,这里我们把图表对象提到函数外来设置
plt.figure(figsize = (20,20))
create_map2('2020-1-30', '确诊', 1,1,1)

输出结果如下:

02


知识点

  • 子图的设置逻辑是先创建绘图对象plt.figure(),然后通过每个图表的ax=plt.subplot(x,y,n)来设置图表的位置,所以这里的函数不再有创建绘图对象这一步
  • 由于我们会创建多张图表,地图上的省市信息字体会很小,所以不再做显示

利用for循环批量出图,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 构建for循环批量出图
# 设置日期列表
datelst = ['2020-1-29','2020-1-30','2020-2-1','2020-2-2','2020-2-3','2020-2-4']

# 创建绘图对象
plt.figure(figsize=(20,18))

# 批量出图
m = 1
for i in datelst:
create_map2(i,'确诊', 3,2,m)
m += 1

输出结果如下:

03


知识点

  • (x,y)参数会根据你的图表个数来设置,例如6天的数据,所以设置为3行*2列
  • m作为子图的需要,每次for循环中都要递增,m+=1是一般的写法
  • 创建多张图表,字体会很小所有不设置显示

到这里,关于新冠病毒疫情数据分析的内容就结束了,这十篇文章基本上将基础的分析方法及分析结果都展示出来了。但在数据分析中,也仅仅是基础的内容,更多有趣有深度的方法和结论还需要各位不断的学习和研究,也欢迎大家分享更多有意思的内容,共同进步!

吃颗糖