python绘制2019-nCoV疫情地图

python绘制2019-nCoV疫情地图_第1张图片

疫情的第43天

为武汉祈福

为中国祈福

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

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

建立logistic预测模型

这一期将要介绍如何利用python的basemap模块来绘制如下疫情地图

python绘制2019-nCoV疫情地图_第2张图片

图1 2019-nCoV疫情地图

准备工作

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

这个网站去下载中国shapefile文件,可恶的是这个网站给出的地图竟然没有包括台湾省和中国南海岛屿在内,这是每一位爱国人士不能容忍的,等以后找到更合适的资源,一定要换。

python绘制2019-nCoV疫情地图_第3张图片

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疫情地图_第4张图片

共有四类,表示数据精确的颗粒,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://blog.csdn.net/zengbowengood/article/details/104212224

2,https://zhuanlan.zhihu.com/p/37336863

3,basemap中文手册[译]

4,basemap英文教程

5,https://mp.weixin.qq.com/s/NVUn0gVK9AiEm1II8c3g4g

- - -The end- - - 


你可能喜欢

买口罩的数学问题

python实现2019-nCoV确诊数据拟合与预测

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

数学电影《模仿游戏》

python绘制笛卡尔直角坐标系

三行科创微信公众号欢迎投稿,提供线索

稿件聚焦数学、逻辑,数学工程,数学文化等领域

一经采用,我们将奉上酬劳

投稿邮箱:[email protected]

商务合作:17521754388

加入交流群,添加微信:melite01(备注 交流群)

python绘制2019-nCoV疫情地图_第5张图片

你可能感兴趣的:(python绘制2019-nCoV疫情地图)