【python数据分析】绘制疫情可视化地图、气泡图

1. 示例图

图一:具体某天的全国确诊病例可视化地图
在这里插入图片描述
图二:具体某天的全国确诊病例可视化气泡图
在这里插入图片描述
图三:具体某天的全国确诊病例可视化气泡图(增加颜色维度,代表疑似病例),并增加地图背景
在这里插入图片描述

2. 前期准备

2.1 python第三方库

不多废话,直接上正题,需要使用到的python第三方库如下:

geopandas(处理地理空间数据),pandas(数据合并及处理),matplotlib(出图)

注意: 使用的编辑器是jupyter notebook,关于geopandas下载安装建议在Anaconda里的命令行使用conda指令进行,使用的三个库的版本号为:

import geopandas,matplotlib,pandas
print('geopandas使用的当前版本号:{}\n'.format(geopandas.__version__),
      'matplotlib使用的当前版本号:{}\n'.format(matplotlib.__version__),
      'pandas使用的当前版本号:{}'.format(pandas.__version__))

→ 输出的结果为:(由于存在着版本的不同,在调用的时候可能会出现warning警告,这个可以引入自带的warning库进行警告过滤。注意:警告不是报错,不影响程序执行)

geopandas使用的当前版本号:0.6.1
matplotlib使用的当前版本号:3.1.3
pandas使用的当前版本号:1.0.3

import warnings
warnings.filterwarnings('ignore')

2.2 准备文件

第一份:疫情数据,手动整理官方渠道发布的数据(时间起始为:2020年1月22至2020年2月23日)

第二份:中国地图(这里使用是省市地图json格式,也可以是shp格式,方便在地图上显示注解文字)

关于上面的两份文件已经上传至资源,有需要可以自行下载

3. 数据整理

3.1 数据文件导入

在最开始导入需要使用的第三方库后,进行所需文件数据的读取,包含了疫情数据和中国地图数据

import warnings
warnings.filterwarnings('ignore')
# 设置不弹出警告
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt

df = pd.read_excel('virus_data.xlsx')
china_spatial = gpd.GeoDataFrame.from_file('chinadata.json')

print(df.head())
print(china_spatial.head())

→ 输出的结果为:(上面为疫情数据,下面为中国地图数据)

	区域编码	省市	  	   疑似 确诊 死亡 date
0	110000	北京市		0	14	0	20200122
1	120000	天津市		0	4	0	20200122
2	130000	河北省		0	1	0	20200122
3	140000	山西省		1	1	0	20200122
4	150000	内蒙古自治区	0	0	0	20200122

	name			centerlng	centerlat	geometry
0	安徽省			117.226		31.8257		POLYGON ((119.62594 31.13353, 119.64401 31.114...
1	北京市			116.412		40.1844		POLYGON ((117.38359 40.22566, 117.37170 40.216...
2	福建省			117.981		26.0783		MULTIPOLYGON (((118.25399 24.44654, 118.27072 ...
3	甘肃省			100.612		37.8776		POLYGON ((104.29087 37.43066, 104.30275 37.415...
4	广西壮族自治区	108.789		23.8206		MULTIPOLYGON (((107.15419 21.75961, 107.15774 ...

3.2 数据处理及某日数据提取

观察date字段(时间)信息,发现并不是直接可以使用的,需要转化为时间序列,再进行数据的提取以及时间序列的分析(这里只需要提取某一日的数据即可)

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

# 提取2020-2-1日数据
data_0201 = df[df['date'] == '2020-2-1']
data_0201.head()

→ 输出的结果为:(这一步清洗完了date时间字段的数据)

	区域编码	省市	   		疑似	确诊	死亡	 date
340	110000	北京市		0	183	1	2020-02-01
341	120000	天津市		112	45	0	2020-02-01
342	130000	河北省		104	104	1	2020-02-01
343	140000	山西省		64	56	0	2020-02-01
344	150000	内蒙古自治区	7	26	0	2020-02-01

根据输出的结果可以发现,疫情数据和中国地图数据中存在相同的字段,因此可以进行合并,构成绘制可视化地图的数据

data_china0201 = pd.merge(china_spatial, data_0201, left_on = 'name', right_on = '省市', how = 'left')
del data_china0201['name']  # 删除多余字段,这里存在重复字段,删除一个
data_china0201 = data_china0201.sort_values(by = '疑似',ascending = False)
data_china0201.head()

→ 输出的结果为:(这一步形成的数据就可以直接绘制图像了)

	centerlng	centerlat	geometry									区域编码	省市		疑似	确诊	死亡		date
10	112.271	30.9752	POLYGON ((110.98875 33.25267, 111.02028 33.215...	420000	湖北省	14872	9074	294	2020-02-01
8	113.614	33.8815	POLYGON ((115.47751 36.14881, 115.47705 36.116...	410000	河南省	754	493	2	2020-02-01
11	111.709	27.6099	POLYGON ((113.93672 29.05043, 113.94089 29.021...	430000	湖南省	434	463	0	2020-02-01
30	107.875	30.0571	POLYGON ((109.58158 31.73005, 109.61777 31.713...	500000	重庆市	425	262	1	2020-02-01
4	108.789	23.8206	MULTIPOLYGON (((107.15419 21.75961, 107.15774 ...	450000	广西壮族自治区	319	111	0	2020-02-01

4. 绘制图形

4.1 疫情可视化地图

第一步: 设置画布大小

第二步:设置标题文字属性

第三步:出图(其中的参数除了选择数据的外,几乎都是图像的属性参数)

第四步:网格线(这里建议在使用matplotlib时候直接把配置文件的属性修改了),可以参考matplotlib配置参数修改

plt.figure(figsize=(20,20))
plt.title('2020-2-1 全国确诊病例', fontsize = 20)

# 绘制疫情地图
data_china0201.plot(ax=plt.subplot(1,1,1), alpha=1,edgecolor='k', linewidth = 0.5,
                  legend=True, scheme = 'FisherJenks', column='确诊', cmap = 'Reds')
                  
# 设置网格线
plt.grid(True,alpha=0.5)

→ 输出的结果为:(第一张图基本出来了)
在这里插入图片描述
为什么选择省市地图数据,因为地图板块划分的较大,方便在地图上进行文字注解,如果需要地级市的中国地图资源,也可以(这个也上传了),有需要可以自己下载

# 添加省市信息
lst = data_china0201[['省市','centerlng','centerlat','确诊']].to_dict(orient = 'record')
print(lst[:5])   # 查看输出结果

for i in lst:
    plt.text(i['centerlng']-1, i['centerlat'], i['省市'] +':' + str(i['确诊']))

→ 输出的结果为:(第一张图完成)
在这里插入图片描述

4.2 疫情可视化气泡图

前面已经处理好的数据,这里可以直接拿来用。不同的是,绘制气泡图之前需要有一个底图(就是中国地图),一般的话透明度要设置小一点,不然会遮挡住显示的数据

plt.figure(figsize=(20,20))
plt.title('2020-2-1 全国确诊病例', fontsize = 20)

# 绘制底图
data_china0201.plot(ax=plt.subplot(1,1,1),
                  edgecolor='k', linewidth = 0.5, color = 'gray', alpha = 0.1)

# 添加气泡图
plt.scatter(data_china0201['centerlng'],data_china0201['centerlat'],
            s = data_china0201['确诊'], edgecolors='k', alpha = 0.8)

# 设置网格线
plt.grid(True,alpha=0.5)

# 添加省市信息
lst = data_china0201[['省市','centerlng','centerlat','确诊']].to_dict(orient = 'record')
for i in lst:
    plt.text(i['centerlng'], i['centerlat'], i['省市'] +':' + str(i['确诊']))

→ 输出的结果为:(基本上没有什么变化,就是添加一个plt.scatter()绘制气泡图,其余的和之前一样,其中前两个参数就是绘图的x,y轴,s参数就代表这起泡的大小,最后两个参数设置的是边缘线颜色和透明度)
在这里插入图片描述

4.3 疫情可视化气泡图(增添颜色)

在数据处理的最后一步是将数据按照“疑似”字段的数据进行排序,就是为了这里将疑似病例的多少按照起泡颜色的深浅进行显示。和上面代码不同的地方就是在plt.scatter()中设置了c参数,用来显示颜色

fig = plt.figure(figsize=(20,20))
plt.title('2020-2-1 全国确诊病例', fontsize = 20)
fig.set_facecolor('lightsteelblue')
# 绘制底图
data_china0201.plot(ax=plt.subplot(1,1,1),
                  edgecolor='k', linewidth = 0.5, color = 'gray', alpha = 0.5)

# 添加气泡图
plt.scatter(data_china0201['centerlng'],data_china0201['centerlat'], c = data_china0201['疑似'],
			#cmap= ‘Reds’,
            s = data_china0201['确诊'], edgecolors='k', alpha = 0.8)

# 设置网格线
plt.grid(True,alpha=0.5)

# 添加省市信息
lst = data_china0201[['省市','centerlng','centerlat','确诊']].to_dict(orient = 'record')
for i in lst:
    plt.text(i['centerlng']-1, i['centerlat'], i['省市'] +':' + str(i['确诊']),color = 'black',alpha = 0.8)
    
plt.axis('off')

小技巧: c参数一般配合cmap参数(颜色板样式)使用,如果当前默认的颜色不符合自己的需求,想要进行改变颜色,可以查看cmap里面提供了哪些可选的颜色参数,然后再进行设定,这里使用默认的配色,故将cmap参数注释。查看可选的cmap参数的方法

→ 输出的结果为:(最后一张图完成)
在这里插入图片描述

5. 防杠处理

通过上面三张图,可以发现地图中并没有南海的部分,如果进行地图数据可视化,最后生成的图像是要用来商用的或是进行期刊发表的,这里建议进行南海地图的添加,处理方式简单粗暴,直接进行ps修图

5.1 南海版图

为了避免图像清晰度的问题,这里推荐的是直接使用pyecharts官网上面代码生成一个中国地图数据,这里以0.5.11版本的为例

from pyecharts import Map

value = [155, 10, 66, 78]
attr = ["福建", "山东", "北京", "上海"]
map = Map("全国地图示例", width=1200, height=600)
map.add("", attr, value, maptype='china')
map

→ 输出的结果为:(可以看到右下角就有一个很清晰南海版图,点击右边的下载按钮就可以保存本地了)
在这里插入图片描述

5.2 图形ps

第二张图的基调和这个南海版图的一致,这里选择第二图进行处理,打开ps,分别导入两个图片,然后进行处理

补充一下matplotlib储存图片的方式(dpi代表输出的图像的分辨率),也可以直接截图保存

plt.savefig(r'C:\Users\86177\Desktop\demo1.png',dpi =300)

最后将南海版图转移到已经生成的可视化地图上即可
在这里插入图片描述
上面列举第二个基调的图形进行ps处理。如果是其他颜色的,在抠图转移之后,ps的右边菜单栏有图层选项设置,可以选择图层之间融合即可,比如拿第三张图片进行图形ps
在这里插入图片描述

6. 手动防爬虫

码字梳理不易,最近在网上看到了一些博客上直接爬虫的文章,标题都是一样的,为了维护“知识产权”,无可奈何,设置“手动反爬虫”提示

博客来源于CSDN作者lys_828,资源链接为:https://editor.csdn.net/md?articleId=106363593

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/106363593