python获取2019-nCoV疫情实时追踪数据
建立logistic预测模型
这一期将要介绍如何利用python的basemap模块来绘制如下疫情地图
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文件。
3,下面重点讲一下重点函数类的参数含义和调用
basemap
具体调用方式是
map=Basemap(llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat, projection, resolution, ax)
其中
map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, **kwargs)
'cyl' #默认值,表示cylindrical Equidistant projection (等距圆柱投影)的缩写,也叫作等距柱状投影
'ortho' #orthognal的意思,表示正交投影
'merc' #大名鼎鼎的墨卡托投影
这里我们采用 墨卡托投影方法,写出来就是
map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, projection='merc', **kwargs)
map=Basemap(llcrnrlon=70, llcrnrlat=3, urcrnrlon=140, urcrnrlat=54, projection='merc', resolution='f', **kwargs)
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’)
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