python绘制2019-nCoV疫情地图

python绘制2019-nCoV疫情地图

  • 准备工作
  • 完整代码
  • 代码解读

前面两期已经做了获取疫情实时追踪数据和利用确诊数据建立logistic模型的工作,传送门

python获取2019-nCoV疫情实时追踪数据

建立logistic预测模型

这一期将要介绍如何利用python的basemap模块来绘制如下疫情地图
python绘制2019-nCoV疫情地图_第1张图片

准备工作

1,下载pyproj和basemap
既然要用到basemap,那么至少保证安装了这个模块,而basemap又依赖于pyproj模块,所以先要安装pyproj模块和basemap模块,这两个模块都不小,其中basemap高达116M,建议通过http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载本地安装,比如我的是Windows10,64位操作系统,python3.7的就下载下面两个文件

pyproj‑1.9.6‑cp37‑cp37m‑win_amd64.whl

basemap‑1.2.1‑cp37‑cp37m‑win_amd64.whl

然后通过Anaconda prompt 命令行进行拖拽安装。

2,下载shape文件
可以到https://gadm.org/download_country_v3.html这个网站去下载中国shape文件。
python绘制2019-nCoV疫情地图_第2张图片
3,下面重点讲一下重点函数类的参数含义和调用
basemap
具体调用方式是

map=Basemap(llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat, projection, resolution, ax)

其中

  • llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat四个参数表示经度下界,纬度下界,经度上界,纬度上界,用来限定显示地图的范围,比如我国经度范围:73°33′E至135°05′E,纬度范围是3°51′N至53°33′N,那么,可以写成
map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, **kwargs)
  • projection表示地图的投影方式,如果你用过ArcGIS就知道,当导入shape文件不设置projection参数的话,就会提示没有空间参考。常用的projection参数有
'cyl' #默认值,表示cylindrical Equidistant projection (等距圆柱投影)的缩写,也叫作等距柱状投影
'ortho' #orthognal的意思,表示正交投影
'merc' #大名鼎鼎的墨卡托投影

这里我们采用 墨卡托投影方法,写出来就是

map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, projection='merc', **kwargs)
  • resolution 用来设置边界的详细程度,即分辨率,如果不使用边界,可以是“c”(粗)、“l”(低)、“i”(中)、“h”(高)、“f”(满),我们这里写个满
map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, projection='merc', resolution='f', **kwargs)
  • ax表示覆盖那个图轴,即前面ax=fig.add_subplot( )的序号,比如我这里只有一个子图,那么写出来便是
ax=fig.add_subplot(1, 1, 1)
...
map= Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, projection='merc', resolution='f', ax=ax)

readshapefile
基本调用方式是
readshapefile(self, shapefile, name, drawbounds=True, zorder=None, linewidth=0.5, color=‘k’, antialiased=1, ax=None, default_encoding=‘utf-8’)

  • shapefile参数是必填的,分别表示矢量shape文件路劲和名称,比如我下载的shape文件解压列别如下
    python绘制2019-nCoV疫情地图_第3张图片
    共有四类,表示数据精确的颗粒,0表示精确到国家,1表示省份,2表示地级市,3表示区县,我们这里只要求精确到地级市,故文件名为gadm36_CHN\gadm36_CHN_2,同时,函数会默认.shp,.sbf和.shx等文件同时存在并且文件名相同,只是后缀不同。
  • name表示读取方式,方便以后调用查看
    其余默认即可,写出来便是
map.readshapefile(r'D:\Python项目\2019-nCoV疫情地图\gadm36_CHN\gadm36_CHN_2', 'comarques', drawbounds=False) 

此处的map便是上面Basemap对象,知道这些参数后,你可以不断变换里面的参数值,画出不同效果的图。

完整代码

有了上面的准备工作,下面就来写代码了

# -*- coding: utf-8 -*-
"""
Created on Fri Feb  7 17:06:31 2020
project name:2019-nCoV地图
@author: 帅帅de三叔
"""
import pandas as pd #导入数据分析模块
import matplotlib.pyplot as plt #导入绘图模块的pyplot类
plt.rcParams['font.sans-serif']='SimHei' #画图中的中文
plt.rcParams['axes.unicode_minus']=False #画图中的负号
import matplotlib #导入绘图模块
from mpl_toolkits.basemap import Basemap #导入basemap类
from matplotlib.patches import Polygon
#from matplotlib.collections import PatchCollection #选择地图并且给地图上色
data=pd.read_csv("20200209全国各城市病例.csv") #读取数据
city=data['city_name'] #有疫情的城市名
confirm=data['total_confirm'] #确诊总人数
data_dict={city[i]:confirm[i] for i in range(len(city))} #构造成字典数据格式方便后面画图调用

fig=plt.figure(figsize=(8, 5)) #设置画布大小
ax=fig.add_subplot(1,1,1)
map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, projection='merc', resolution='f') #地图初始化
map.drawcoastlines(linewidth=0.5) #海岸线
map.readshapefile(r'D:\Python项目\2019-nCoV疫情地图\gadm36_CHN\gadm36_CHN_2', 'comarques', drawbounds=True)#加载行政区划文件
comar=map.comarques #经纬度数据
comar_info=map.comarques_info #基本信息
#print(comar_info[0]) #测试一下第一个comar_info
for info, shape in zip(comar_info, comar): #打包成一个个元组
    city_name=info["NL_NAME_2"] #2357个城市
    for key in data_dict.keys(): #334个城市
        if key in city_name:
            #print(data_dict[key])  #测试一下健值
            if data_dict[key]==0:
                color='#f0f0f0'
            elif data_dict[key]<10:
                color='#ffaa85'
            elif data_dict[key]<100:
                color='#ff7b69'
            elif data_dict[key]<1000:
                color='#bf2121'
            else:
                color='#7f1818'
    poly=Polygon(shape, facecolor=color, edgecolor=color)
    ax.add_patch(poly)

handles = [ matplotlib.patches.Patch(color='#ffaa85', alpha=1, linewidth=0),
            matplotlib.patches.Patch(color='#ff7b69', alpha=1, linewidth=0),
            matplotlib.patches.Patch(color='#bf2121', alpha=1, linewidth=0),
            matplotlib.patches.Patch(color='#7f1818', alpha=1, linewidth=0),] #图例设置
labels = [ '1-9人', '10-99人', '100-999人', '>1000人'] #图例
ax.legend(handles, labels, bbox_to_anchor=(0.5, -0.11), loc='lower center', ncol=4) #, prop=font
ax.set_title("2019-nCoV疫情地图")          
plt.show()

代码解读

如果你不会写代码或只想要数据的话或只要里面的shape文件可以关注“三行科创”微信公众号,留个邮箱和数据名称,我发给你.
参考文献
1,https://zhuanlan.zhihu.com/p/37336863
2,python获取2019-nCoV疫情实时追踪数据
3,python实现2019-nCoV疫情确诊数据拟合与预测
4,basemap中文手册
5,basemap英文教程
6,https://mp.weixin.qq.com/s/NVUn0gVK9AiEm1II8c3g4g

你可能感兴趣的:(数据可视化)