当前位置 : 主页 > 编程语言 > python >

python绘制2019-nCoV疫情地图

来源:互联网 收集:自由互联 发布时间:2022-06-15
python绘制2019-nCoV疫情地图 ​​准备工作​​ ​​完整代码​​ ​​代码解读​​ 前面两期已经做了获取疫情实时追踪数据和利用确诊数据建立logistic模型的工作,传送门 ​​python获取



python绘制2019-nCoV疫情地图

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


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

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

​​建立logistic预测模型​​

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

python绘制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​​这个网站去下载中国shape文件。

python绘制2019-nCoV疫情地图_python_02

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疫情地图_python_03
    共有四类,表示数据精确的颗粒,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​​

python绘制2019-nCoV疫情地图_数据_04



上一篇:pyecharts绘制地理散点图
下一篇:没有了
网友评论