[Python从零到壹] 十八.可视化分析之Basemap地图包入门详解

2022-11-25 09:59:28 浏览数 (2)

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。

Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

前一篇文章主要介绍Matplotlib和Pandas扩展包绘图的基础用法,同时引入Echarts技术。这篇文章将详细讲解Matplotlib子包,负责地图绘制,即Basemap扩展包。在做数据挖掘或可视化分析时,常常需要将数据显示到地图上,比如城市人口、空气环境、GDP分布、资源销售、全球热图等。基础文章,希望对您有所帮助。

文章目录:

  • 一.Basemap安装
  • 二.地图绘制官方案 1.Basemap简介 2.案例分析
  • 三.Basemap绘制地图 1.地图投影 2.绘制全球主要城市地球仪
  • 四.总结

下载地址:

  • https://github.com/eastmountyxz/Python-zero2one

前文赏析:

第一部分 基础语法

  • [Python从零到壹] 一.为什么我们要学Python及基础语法详解
  • [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
  • [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象

第二部分 网络爬虫

  • [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
  • [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
  • [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
  • [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
  • [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
  • [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
  • [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)

第三部分 数据分析

  • [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解
  • [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
  • [Python从零到壹] 十三.机器学习之聚类算法四万字总结(K-Means、BIRCH、树状聚类、MeanShift)
  • [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
  • [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
  • [Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
  • [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
  • [Python从零到壹] 十八.可视化分析之Basemap地图包入门详解

第四部分 Python图像处理

第五部分 NLP与文本挖掘

第六部分 人工智能入门知识

第七部分 图像识别与目标检测

第八部分 网络攻防与AI安全

第九部分 知识图谱构建实战

第十部分 人工智能高级案例

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


一.Basemap安装

这里作者只做简单介绍,我们从非官网网站下载下面两个扩展包,cp36表示Python3.6版本,Windows下64位环境加amd64,你需要找到适合自己环境的文件。

  • basemap-1.2.2-cp36-cp36m-win_amd64.whl
  • pyproj-3.0.1-cp36-cp36m-win_amd64.whl

下载地址为:

  • https://www.lfd.uci.edu/~gohlke/pythonlibs/

接下来使用PIP命令去到whl文件所在目录,然后分别进行安装。先安装Pyproj,再安装Basemap扩展包,命令如下:

代码语言:javascript复制
pip install basemap-1.2.2-cp36-cp36m-win_amd64.whl

安装过程如下图所示:

Successfully installed basemap-1.2.2 cycler-0.11.0 kiwisolver-1.3.1 matplotlib-3.3.4 numpy-1.19.5 pillow-8.4.0 pyparsing-3.0.5 pyproj-3.0.1 pyshp-2.1.3 python-dateutil-2.8.2 six-1.16.0

接下来调用该扩展包,不再报错即表示安装成功。


二.地图绘制官方案例

首先作者给出官方文档的介绍以及简单案例,让读者体会下Basemap的魅力。官方网址:

  • https://matplotlib.org/basemap

1.Basemap简介

Basemap工具包是Matplotlib包的子包,一个用于在Python绘制2D数据至地图的库,它提供了将坐标转化为25中不同地图投影的功能,然后调用Matplotlib扩展包绘制轮廓、图像和坐标点等。

该扩展包提供了海岸线、河流、政治边界数据集以及绘制方法。其中GEOS库在内部用于将海岸线和边界特征剪切到所需的地图投影区域。下面给出官网的翻译示例,源地址:

  • https://matplotlib.org/basemap/users/geography.html

Basemap包括GSSH(现在是GSHHG)海岸线数据集以及GMT格式的河流、州和国家边界的数据集。这些数据集可以用来以不同的分辨率绘制海岸线、河流和政治边界地图。相关方法如下:

  • drawcoastlines(): 绘制海岸线。
  • fillcontinents(): 通过填充海岸线多边形为地图着色。
  • drawcountries(): 绘制国家边界。
  • drawstates(): 在北美绘制状态边界。
  • drawrivers(): 绘制河流。

此外,可以将图像用作地图背景,而不是绘制海岸线和政治边界。Basemap提供了以下几个选项:

  • drawlsmask(): 绘制高分辨率的海陆图像,指定陆地和海洋的颜色,数据源于GSHHS海岸线。
  • bluemarble(): 绘制NASA蓝色大理石图像作为地图背景。
  • shadedrelief(): 绘制阴影浮雕图像作为地图背景。
  • etopo(): 绘制一张etopo浮雕图像作为地图背景。
  • warpimage(): 使用abitrary图像作为地图背景,必须是全球新的,从国际日东线向东和南极以北覆盖世界。

2.案例分析

(1) 绘制海岸线、填充海洋和陆地区域

代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
 
# 设置basemap-Lambert Conformal 
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution='c',lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
 
# 绘制海岸线
m.drawcoastlines()
# 在地图周围绘制边界并填充背景aqua(这个背景最终成为海洋的颜色)
# 将大洲绘制在最上面
m.drawmapboundary(fill_color='aqua')
 
# 填充大陆coral颜色,并设置湖泊颜色为blue
m.fillcontinents(color='coral',lake_color='blue')
plt.show()

绘制图形如下所示:

(2) 绘制一幅海陆罩(land-sea mask)图像

代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
 
# 设置basemap Lambert-Conformal 
# 设置分辨率参数resolution=None 跳过处理边界数据集
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
 
# 为地图背景绘制海陆罩
# lakes=True 意味着内陆湖和海洋颜色一致
m.drawlsmask(land_color='coral',ocean_color='aqua',lakes=True)
plt.show()

绘制如下图所示:

(3) 绘制美国宇航局蓝色大理石图像(the NASA Blue Marble)

代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
 
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
m.bluemarble()
plt.show()

绘制如下图所示:

(4) 绘制带阴影的浮雕图像

代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
 
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
m.shadedrelief()
plt.show()

绘制如下图所示:

(5) 绘制etopo浮雕图像

代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
 
m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
m.etopo()
plt.show()

绘制如下图所示:


三.Basemap绘制地图

1.地图投影

可能读者已经发现了,Basemap扩展包是绘制地图最重要的库之一,所以作者先讲解该库函数。同时,由于作者没有找到系统的参数介绍,只能摸着石头过河学习,也希望对您有点帮助。

为方便呈现,需要将三维球坐标系转换为二维笛卡尔坐标系,利用地图投影(Map Projection)实现。官网给出的25种映射方式如下:

  • https://matplotlib.org/basemap/users/mapsetup.html

lcc类型的核心代码如下:

代码语言:javascript复制
m = Basemap(width=12000000,
		height=9000000,
		projection='lcc',
		resolution=None,
		lat_1=45.,
		lat_2=55,
		lat_0=50,
		lon_0=-107.)

参数介绍如下:

  • width:宽度
  • height:高度
  • projection=‘lcc’:表示规定的投影方法,改变投影方法绘制的结果也将不同,25种方式
  • resolution=None:表示跳过处理边界数据集
  • lat_0=50:维度设置为50(Latitude,值为-90到90)
  • lon_0=-107:经度设置为-107( Longitude,值为-180到180)

示例代码如下:

  • https://matplotlib.org/basemap/users/aeqd.html
代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
 
width = 28000000; lon_0 = -105; lat_0 = 40
m = Basemap(width=width,height=width,projection='aeqd',
            lat_0=lat_0,lon_0=lon_0)
 
# 填充背景
m.drawmapboundary(fill_color='aqua')

# 绘制海岸线并填充大陆
m.drawcoastlines(linewidth=0.5)
m.fillcontinents(color='coral',lake_color='aqua')

# 20度经纬度,范围-80到81 -180到180
m.drawparallels(np.arange(-80,81,20))
m.drawmeridians(np.arange(-180,180,20))

# 在中心绘制一个黑点
xpt, ypt = m(lon_0, lat_0)
m.plot([xpt],[ypt],'ko')

# 绘制标题
plt.title('Azimuthal Equidistant Projection')
plt.show()

运行结果如下图所示:

merc类型的核心代码如下:

代码语言:javascript复制
m = Basemap(projection='merc',
		llcrnrlat=-80,
		urcrnrlat=80,
		llcrnrlon=-180,
		urcrnrlon=180)

参数介绍如下:

  • projection=merc’:表示规定的投影方法,墨卡托投影(Mercator Projection),广泛应用谷歌地图
  • llcrnrlat=-80:所需地图域左下角的纬度(度)Latitude
  • urcrnrlat=80:所需地图域的右上角的纬度(度)Latitude
  • llcrnrlon=-180:所需地图域左下角的经度(度)Longitude
  • urcrnrlon=180:所需地图域(度)的右上角的经度Longitude

示例:

代码语言:javascript复制
# -*- coding: utf-8 -*-
# By:Eastmount CSDN
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
 
m = Basemap(projection='merc', llcrnrlat=-80, urcrnrlat=80,
            llcrnrlon=-180, urcrnrlon=180)
m.drawcoastlines()
plt.show()

绘制图形如下所示:

同时,绘制一个城市点代码的常见两种方式如下:

代码语言:javascript复制
# 上海经纬度 (31.23N,121.47E)
x = 31.23
y = 121.47
xpt, ypt = m(x,y)
m.scatter(xpt,ypt,s=2)
 
x = 31.23
y = 121.47
xpt, ypt = m(x,y)
m.plot([xpt],[ypt],'ko')

2.绘制全球主要城市地球仪

接下来我们学习vamei老师绘制全球主要城市的地球仪,其数据保存于major_city.txt文件中,内容如下:

  • 城市名
  • 人口名
  • 维度
  • 经度
  • 国家
代码语言:javascript复制
Shanghai 23019148  31.23N  121.47E  China
Mumbai   12478447  18.96N  72.82E   India
Karachi  13050000  24.86N  67.01E   Pakistan
Delhi    16314838  28.67N  77.21E   India
Manila   11855975  14.62N  120.97E  Philippines
Seoul    23616000  37.56N  126.99E  Korea(South)
Jakarta  28019545   6.18S  106.83E  Indonesia
Tokyo    35682460  35.67N  139.77E  Japan
Peking   19612368  39.91N  116.39E  China

接着调用Basemap绘制图形,代码如下:

  • http://www.cnblogs.com/vamei
代码语言:javascript复制
# -*- coding: utf-8 -*-
# Written by Vamei, http://www.cnblogs.com/vamei/
# Feel free to use or modify this script.
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
 
#============================================
# read data
names = []
pops  = []
lats  = []
lons  = []
countries = []
for line in open("major_city.txt","r"):
    info = line.split()
    names.append(info[0])
    pops.append(float(info[1]))
    lat  = float(info[2][:-1])
    if info[2][-1] == 'S': lat = -lat
    lats.append(lat)
    lon  = float(info[3][:-1])
    if info[3][-1] == 'W': lon = -lon   360.0
    lons.append(lon)
    country = info[4]
    countries.append(country)
 
#============================================
# set up map projection with
# use low resolution coastlines.
map = Basemap(projection='ortho',lat_0=35,lon_0=120,resolution='l')
# draw coastlines, country boundaries, fill continents.
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
# draw the edge of the map projection region (the projection limb)
map.drawmapboundary(fill_color='#689CD2')
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0,360,30))
map.drawparallels(np.arange(-90,90,30))
# Fill continent wit a different color
map.fillcontinents(color='#BF9E30',lake_color='#689CD2',zorder=0)
# compute native map projection coordinates of lat/lon grid.
x, y = map(lons, lats)
max_pop = max(pops)
# Plot each city in a loop.
# Set some parameters
size_factor = 80.0
y_offset    = 15.0
rotation    = 30
for i,j,k,name in zip(x,y,pops,names):
    size = size_factor*k/max_pop
    cs = map.scatter(i,j,s=size,marker='o',color='#FF5600')
    plt.text(i,j y_offset,name,rotation=rotation,fontsize=10)
 
plt.title('Major Cities in Asia & Population')
plt.show()

绘制图形如下图所示:


四.总结

最后给出比较好的参考资料,供自己和大家后面学习。希望文章对大家有所帮助,该篇文章主要是个安装引入,后面还将结合项目深入介绍,推荐大家尽量结合实战进行学习,比如航班预测、中国GPD区域分析等。如果存在错误或不足之处,还请海涵。

  • Basemap可视化地图信息 - zm
  • [经验总结] 一点总结:Ubuntu anaconda Python basemap( WRF) - 气象家园
  • 绘图: matplotlib Basemap简介 - Vamei
  • Creating a Choropleth Map of the World in Python using Basemap
  • Basemap绘制中国地图 - 落叶小唱
  • 用Python画一个中国地图 - 张京

该系列所有代码下载地址:

  • https://github.com/eastmountyxz/Python-zero2one

感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~

简单纪念下,CSDN阅读量即将破千万,全网粉丝近30万。十年啊,近700篇文章,确实可以说一句:这就是我20到30岁的青春,这里既有技术博客,也有娜璋珞一家的故事,我们的爱情史,也见证了一个自幼受贵州大山熏陶的学子慢慢成长,让我认识了许许多多的博友。如图的苏老师,受尽挫折,博士毕业,回到家乡玉林成为了一名大学老师,今天更是自费建成了化学实验室,只想将自己的所学所感传递给他的学生。十年,我在CSDN认识了许多这样的博友、老师和大佬,我们从未谋面,我们天南地北,但相互鼓励,苔花如米小,也学牡丹开。

最后,感谢CSDN,这些年让我骗了很多礼物,更感谢每一位阅读过娜璋故事,每一位给我技术博客点赞的读者。也希望大家记住一个叫Eastmount的分享者,对,不是什么专家,也不是什么大佬,就是一个默默撰写博客的技术分享者,因为爱所以写(今年太忙写得很少很少)。我还将在CSDN写二十年,三十年,一辈子,也将记录我们一家的故事。好想继续抒写我们的故事,但太忙太忙,毕业后再好好写吧。

希望能早日毕业,回到家乡贵州继续当个教书匠,感觉好多要分享的博客,好多要上的课程,好多要开源的代码,好多要学习的知识,期待再次站在讲台前的那一天。继续沉下心去学习,虽菜但勤,感恩遇见,继续加油,晚安娜!

(By:娜璋之家 2022-07-13 夜于地球)

0 人点赞