-
示例图
-
-
前期准备
-
-
-
2.1 python第三方库
-
2.2 准备文件
-
-
数据整理
-
-
-
-
3.2 数据处理及某日数据提取
-
-
绘制图形
-
-
-
4.1 疫情可视化地图
-
4.2 疫情可视化气泡图
-
4.3 疫情可视化气泡图(增添颜色)
-
-
防杠处理
-
-
-
5.1 南海版图
-
5.2 图形ps
-
-
手动防爬虫
-
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时候直接把配置文件的属性修改了),可以参考
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参数注释。
→ 输出的结果为:(最后一张图完成)
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