【python数据分析】绘制疫情可视化地图、气泡图1. 示例图2. 前期准备3. 数据整理4. 绘制图形5. 防杠处理6. 手动防爬虫

时间:2024-02-16 13:10:47

疫情数据地理可视化

    1. 示例图

    1. 前期准备

    • 2.1 python第三方库

    • 2.2 准备文件

    1. 数据整理

    • 3.1 数据文件导入

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

    1. 绘制图形

    • 4.1 疫情可视化地图

    • 4.2 疫情可视化气泡图

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

    1. 防杠处理

    • 5.1 南海版图

    • 5.2 图形ps

    1. 手动防爬虫

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