运用python绘制2091-nCoV疫情地图

准备工作


1,下载pyproj和basemap


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

(为了便于大家安装环境,特附链接,不需要币)

pyproj‑2.2.2‑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)

其中

  • 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)

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

扫描二维码关注公众号,回复: 10652639 查看本文章

shapefile参数是必填的,分别表示矢量shape文件路劲和名称,比如我下载的shape文件解压列别如下
 

在这里插入图片描述

 共有四类,表示数据精确的颗粒,0表示精确到国家,1表示省份,2表示地级市,3表示区县,我们这里只要求精确到地级市,故文件名为gadm36_CHN\gadm36_CHN_2,同时,函数会默认.shp,.sbf和.shx等文件同时存在并且文件名相同,只是后缀不同。
name表示读取方式,方便以后调用查看
其余默认即可,写出来便是
 

map.readshapefile('./data/gadm36_CHN_shp/gadm36_CHN_2', 'comarques', drawbounds=True)#加载行政区划文件

完整代码

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

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 18 21:12:33 2020
project name:2019-nCoV地图
@author: berlin
"""

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("./data/全国各城市病例数据.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('./data/gadm36_CHN_shp/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()

 参考文献


 

发布了48 篇原创文章 · 获赞 23 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/BC_COM/article/details/104390903