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

您所在的位置:网站首页 世界地图如何绘制 【python数据分析】绘制疫情可视化地图、气泡图

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

2024-07-09 15:46| 来源: 网络整理| 查看: 265

疫情数据地理可视化 1. 示例图2. 前期准备2.1 python第三方库2.2 准备文件 3. 数据整理3.1 数据文件导入3.2 数据处理及某日数据提取 4. 绘制图形4.1 疫情可视化地图4.2 疫情可视化气泡图4.3 疫情可视化气泡图(增添颜色) 5. 防杠处理5.1 南海版图5.2 图形ps 6. 手动防爬虫

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3