basemap地图绘制

  • basemap地图绘制
    • 1 basemap的使用
      • 1.1 basemap安装
      • 1.2 basemap使用
      • 1.3 缩放区域与绘图
    • 2 basemap综合示例
      • 2.1 美国人口分布
      • 2.2 全球地震可视化
    • 3 pyecharts地图绘制
      • 3.1 地图
      • 3.2 地图坐标系

basemap地图绘制

地图绘制也是数据可视化的一部分,常用的地图绘制库为basemap工具包,其为matplotlib的子包。本篇文章讲解如何利用whl文件在Python3环境下安装basemap;学会使用basemap绘制地图;学会缩放区域和绘制散点图;通过综合案例,巩固basemap的绘制地图方法和技巧。
涉及到的知识点有:

  • basemap安装:学会basemap的安装方法。
  • basemap使用:学会利用basemap绘制简单地图。
  • 缩放区域与绘图:学会通过定位经纬度缩放区域与绘制散点图。
  • 综合案例:通过综合案例,巩固basemap的绘制地图方法和技巧。

1 basemap的使用

basemap是一个强大的绘制地图工具包。本节将讲解如何安装和使用basemap,结合matplotlib,绘制地图。

1.1 basemap安装

在anaconda的python3环境中,通过conda命令安装basemap会导致失败,这里通过该网站(https://www.lfd.uci.edu/~gohlke/pythonlibs/)下载对应版本的Pyproj和basemap的whl文件,如图1和2所示。

图1 Pyproj下载

图2 basemap下载
在anaconda环境中,切换到这两个whl文件的路径下,按顺序通过pip依次安装Pyproj和basemap文件,代码如下,安装Pyproj,如图3所示,代表Pyproj安装成功。

h:
cd H:\python数据分析\数据
pip install pyproj-1.9.5.1-cp36-cp36m-win_amd64.whl


图3 Pyproj安装
以同样的方法安装basemap,代码如下,如图4所示,安装basemap。

h:
cd H:\python数据分析\数据
pip install basemap-1.1.0-cp36-cp36m-win_amd64.whl


图4 basemap安装
如图5所示,通过from mpl_toolkits.basemap import Basemap代码调用该库,发现程序可以运行,代表basemap库安装成功。

图5 安装成功

1.2 basemap使用

首先,导入需要的第三方库,通过basemap初始化一个地图对象,通过drawcoastlines绘制海岸线,代码如下。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
%matplotlib inlinemap1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,resolution='l', area_thresh=1000.0)      #初始化地图对象
map1.drawcoastlines()      #绘制海岸线

projection参数是用于定义地图的投影方式;lat_0和lon_0是指定地图的中心坐标,这里的值为美国的中心坐标;resolution参数设置绘制边界的精度,l为低精度;area_thresh参数为阈值,低于该阈值的就不会被绘制。绘制地图如图6所示。
注意:更多参数详情可参考http://matplotlib.org/basemap/。

图6 基本地图
通过drawcountries方法绘制国家边界,代码如下,如图7所示。

map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,resolution='l', area_thresh=1000.0)
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家


图7 绘制国家
其他常见的绘制方法如下:

drawmapboundary()   #绘制边界
drawstates()          #绘制州
drawcounties()        #绘制县

通过fillcontinents方法为大陆填充颜色,代码如下,如图12.8所示。

map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,resolution='l', area_thresh=1000.0)
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家
map1.fillcontinents(color='blue',alpha=0.5)  #填充颜色


图8 填充大陆颜色
通过drawmeridians和drawparallels方法绘制经线和纬线,代码如下,如图9所示。

map1 = Basemap(projection='ortho', lat_0=90, lon_0=-105,resolution='l', area_thresh=1000.0)
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家
map1.drawmapboundary() #绘制边界
map1.fillcontinents(color='blue',alpha=0.5)  #填充颜色map1.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map1.drawparallels(np.arange(-90, 90, 30))   #绘制纬线


图9 绘制经度和纬度
更换projection参数,换为robin坐标,可将图绘制为平面坐标,代码如下,如图10所示。

map1 = Basemap(projection='robin', lat_0=90, lon_0=-105,resolution='l', area_thresh=1000.0)
map1.drawcoastlines()  #绘制海岸线
map1.drawcountries()   #绘制国家
map1.drawmapboundary() #绘制边界
map1.fillcontinents(color='blue',alpha=0.5)  #填充颜色map1.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map1.drawparallels(np.arange(-90, 90, 30))   #绘制纬线


图10 平面坐标

1.3 缩放区域与绘图

在实际案例中,需对特定国家或地区进行绘制地图,这样就需要通过llcrnrlon、llcrnrlat、urcrnrlon和urcrnrlat指定左下角经纬度和右上角经纬度,代码如下,如图11所示。

map2 = Basemap(projection='stere', lat_0=90, lon_0=-105,llcrnrlon=-118.67, llcrnrlat=23.41,urcrnrlon=-64.5, urcrnrlat=45.44,resolution='l', area_thresh=1000.0)
map2.drawcoastlines()  #绘制海岸线
map2.drawcountries()   #绘制国家
map2.drawmapboundary() #绘制边界
map2.drawstates()      #绘制州
map2.fillcontinents(color='blue',alpha=0.5)  #填充颜色map2.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map2.drawparallels(np.arange(-90, 90, 30))   #绘制纬线


图11 缩放区域
通过坐标定位,可以在地图上绘制图形,代码如下,如图12所示。

map2 = Basemap(projection='stere', lat_0=90, lon_0=-105,llcrnrlon=-118.67, llcrnrlat=23.41,urcrnrlon=-64.5, urcrnrlat=45.44,resolution='l', area_thresh=1000.0)
map2.drawcoastlines()  #绘制海岸线
map2.drawcountries()   #绘制国家
map2.drawmapboundary() #绘制边界
map2.drawstates()      #绘制州map2.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map2.drawparallels(np.arange(-90, 90, 30))   #绘制纬线lon = -74
lat = 40.43
x,y = map2(lon, lat)       #映射坐标
map2.plot(x, y, 'ro', markersize=8)  #绘制散点图


图12 绘制散点图
通过matplotlib库的text方法,为散点加入文本注释。

map2 = Basemap(projection='stere', lat_0=90, lon_0=-105,llcrnrlon=-118.67, llcrnrlat=23.41,urcrnrlon=-64.5, urcrnrlat=45.44,resolution='l', area_thresh=1000.0)
map2.drawcoastlines()  #绘制海岸线
map2.drawcountries()   #绘制国家
map2.drawmapboundary() #绘制边界
map2.drawstates()      #绘制州map2.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map2.drawparallels(np.arange(-90, 90, 30))   #绘制纬线lon = -74
lat = 40.43
x,y = map2(lon, lat)       #映射坐标
map2.plot(x, y, 'ro', markersize=8)  #绘制散点图
plt.text(x,y,'New York')   #文本注释


图13 文本注释

2 basemap综合示例

本节将讲解如何通过basemap绘制区域与全球地图,结合具体案例,讲解地图的绘制方法和技巧。

2.1 美国人口分布

通过该网站(https://github.com/plotly/datasets/blob/master/2014_us_cities.csv)下载2014年美国城市的人口数据,读取数据,如图14所示,数据总共有四个字段,城市名称、城市人口和经纬度坐标。

图14 美国人口数据
通过以下代码,绘制前180个城市的美国人口分布图,如图15所示。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
%matplotlib inlineplt.style.use('ggplot')
plt.figure(figsize=(10,6))map3 = Basemap(projection='stere', lat_0=90, lon_0=-105,llcrnrlon=-118.67, llcrnrlat=23.41,urcrnrlon=-64.5, urcrnrlat=45.44,resolution='l', area_thresh=1000.0)
map3.drawcoastlines()  #绘制海岸线
map3.drawcountries()   #绘制国家
map3.drawmapboundary() #绘制边界
map3.drawstates()      #绘制州
map3.drawcounties()      # 绘制县map3.drawmeridians(np.arange(0, 360, 30))    #绘制经线
map3.drawparallels(np.arange(-90, 90, 30))   #绘制纬线lat = np.array(pop_data["lat"][0:180])                        # 获取维度之维度值
lon = np.array(pop_data["lon"][0:180])                        # 获取经度值
pop = np.array(pop_data["pop"][0:180],dtype=float)    # 获取人口数,转化为numpy浮点型
size = (pop/np.max(pop))*1000 # 计算每个点的大小x,y = map3(lon,lat)
map3.scatter(x,y,s=size)plt.title('Population distribution in America')     #加标题

代码分析:
(1)1~5行
导入程序需要的库。
(2)7~8行
设置图表的样式为ggplot,并设置图表的长宽比。
(3)10~21行
定义basemap对象,并绘制出美国的地图底图和经纬度。
(4)23~29
获取前180个数据,并绘制散点图。

图15 美国人口分布图
注意:人口如果不转化为numpy浮点型,散点图不会显示出大小不一。

2.2 全球地震可视化

通过美国地震局官网(https://earthquake.usgs.gov/earthquakes/feed/v1.0/csv.php)下载过去一周的地震数据,如图16所示。

图16 过去一周地震数据下载
读取数据,如图17所示,该数据有很多字段,但本次分析中用到的就是经纬度字段和mag字段(震级)。

图17 地震数据
对这三个字段查看缺失值,如图18所示,mag字段有1个缺失值。

图18 查看缺失值
通过过滤剔除到这个缺失值,如图19所示。

图19 过滤缺失值
通过以下代码,绘制地震分布图,如图20所示。

plt.style.use('ggplot')
plt.figure(figsize=(10,6))map4 = Basemap(projection='robin', lat_0=39.9, lon_0=116.3,resolution = 'l', area_thresh = 1000.0) map4.drawcoastlines()         #绘制海岸线
map4.drawcountries()          #绘制国家
map4.drawmapboundary()      #绘制边界map4.drawmeridians(np.arange(0, 360, 30))     #绘制经线
map4.drawparallels(np.arange(-90, 90, 30))      #绘制纬线x,y = map4(list(eq_data['longitude']),list(eq_data['latitude']))
map4.plot(x, y, 'ro', markersize=6)       #绘制散点图


图20 全球地震分布图(1)
根据震级大小,绘制散点不一的地震分布图,如图21所示。

plt.style.use('ggplot')
plt.figure(figsize=(10,6))map5 = Basemap(projection='robin', lat_0=39.9, lon_0=116.3,resolution = 'l', area_thresh = 1000.0) map5.drawcoastlines()
map5.drawcountries()
map5.drawmapboundary()map5.drawmeridians(np.arange(0, 360, 30))
map5.drawparallels(np.arange(-90, 90, 30))size = 2    #初始化大小
for lon, lat, mag in zip(list(eq_data['longitude']), list(eq_data['latitude']), list(eq_data['mag'])):x,y = map5(lon, lat)msize = mag * size     #不同震级大小不一样map5.plot(x, y, 'ro', markersize=msize)

图21 全球地震分布图(2)
通过以下代码,定义一个函数,可通过不同震级绘制颜色不同的地图,如图22所示。

def get_marker_color(mag):if mag < 3.0:return ('go')elif mag < 5.0:return ('yo')else:return ('ro')      #定义设置颜色函数plt.style.use('ggplot')
plt.figure(figsize=(10,6))map6 = Basemap(projection='robin', lat_0=39.9, lon_0=116.3,resolution = 'l', area_thresh = 1000.0) map6.drawcoastlines()
map6.drawcountries()
map6.drawmapboundary()map6.drawmeridians(np.arange(0, 360, 30))
map6.drawparallels(np.arange(-90, 90, 30))size = 2
for lon, lat, mag in zip(list(eq_data['longitude']), list(eq_data['latitude']), list(eq_data['mag'])):x,y = map6(lon, lat)msize = mag * sizemap6.plot(x, y, get_marker_color(mag), markersize=msize)   #调用函数plt.title('Earthquakes')

图22 全球地震分布图(3)

3 pyecharts地图绘制

pyecharts也可以轻松绘制出美观可交互的地图。本节将讲解如何利用pyecharts绘制不同地区的地图,通过Geo方法在地图上绘制散点图。

3.1 地图

利用pyecharts绘制地图,需要下载地图js文件,通过pip进行安装,如图23所示。

pip install echarts-countries-pypkg        #全球国家地图
pip install echarts-china-provinces-pypkg  #中国省级地图
pip install echarts-china-cities-pypkg      #中国市级地图


图23 安装地图js
注意:安装好后记得重启jupyter notebook。
利用Map方法可绘制地图,代码如下。

value = [155, 78, 23, 65]
label = ["北京", "上海", "西藏", "广东"]
map1 = pyecharts.Map("全国地图示例")
map1.add("",label, value, maptype='china')
map1.render()   #生成html文件

该add方法的参数如下,maptype设置地图类型,支持china、world、中国省市名称等;is_roam可缩放地图;is_map_symbol_show显示地图红点。

add(name, attr, value,maptype='china',is_roam=True,is_map_symbol_show=True, **kwargs)

绘制的中国地图如图24所示。

图24 全国地图(1)
设置is_label_show=True,可以显示各省份名称,代码如下,如图25所示。

value = [155, 78, 23, 65]
label = ["北京", "上海", "西藏", "广东"]
map1 = pyecharts.Map("全国地图示例", width=1200, height=600)
map1.add("",label, value, maptype='china', is_label_show=True)
map1.render()   #生成html文件


图25 全国地图(2)
结合Visualmap可以美化地图,根据值显示不同颜色,代码如下,如图26所示。

value = [155, 78, 23, 65]
label = ["北京", "上海", "西藏", "广东"]
map1 = pyecharts.Map("全国地图示例", width=1200, height=600)
map1.add("",label, value, maptype='china', is_visualmap=True,visual_text_color='#000')
map1.render()   #生成html文件

图26 全国地图(3)

修改maptype参数可以绘制省级地图,代码如下,如图27所示。

value = [233, 102, 41, 82]
attr = ['武汉市', '咸宁市', '黄冈市', '黄石市']
map1 = pyecharts.Map("湖北省地图")
map1.add("", attr, value, maptype='湖北', is_visualmap=True,visual_text_color='#000')
map1.render()


图27 湖北省地图
修改maptype参数为world可以绘制世界地图,代码如下,如图28所示。

value = [46, 54, 45, 82, 45]
attr= ["China", "Canada", "Brazil", "Russia", "United States"]
map1 = pyecharts.Map("世界地图", width=1200, height=600)
map1.add("", attr, value, maptype="world", is_visualmap=True,visual_text_color='#000', is_map_symbol_show=False)
map1.render()


图28 全球地图

3.2 地图坐标系

地图坐标系组件用于地图的绘制,支持在地图上绘制散点图,线集。利用Geo方法可在地图上绘制散点图等,代码如下。

data = [('上海', 78),('武汉', 56),('长沙', 45),('北京', 65),('苏州', 32),('盐城', 15),('南昌', 87),('青岛', 45),('广州', 78),('拉萨', 12),('桂林', 21),('西安', 42),('济南', 12)]geo = pyecharts.Geo("地图绘制案例一",title_pos="center", width=1200,height=600)
attr, value = geo.cast(data)
geo.add("", attr, value, visual_range=[0, 100], visual_text_color="#fff",geo_normal_color="#FFFFFF",symbol_size=15, is_visualmap=True)
geo.render()

该add方法的参数如下,type设置图例类型,‘scatter’, ‘effectScatter’, 'heatmap’可选;symbol_size为散点图大小;border_color设置地图边界颜色;geo_normal_color为正常情况下地图区域颜色;geo_emphasis_color为高亮下地图区域的颜色。

add(name, attr, value,type="scatter",maptype='china',symbol_size=12,border_color="#111",geo_normal_color="#323c48",geo_emphasis_color="#2a333d",is_roam=True, **kwargs)

绘制的地图如图29所示。

图29 案例一
修改type参数,更改为heatmap,代码如下,如图30所示。

data = [('上海', 78),('武汉', 56),('长沙', 45),('北京', 65),('苏州', 32),('盐城', 15),('南昌', 87),('青岛', 45),('广州', 78),('拉萨', 12),('桂林', 21),('西安', 42),('济南', 12)]geo = pyecharts.Geo("地图绘制案例二",title_pos="center", width=1200,height=600)
attr, value = geo.cast(data)
geo.add("", attr, value, type='heatmap', visual_range=[0, 100], visual_text_color="#fff",geo_normal_color="#FFFFFF",symbol_size=15, is_visualmap=True)
geo.render()


图30 案例二

【Python实用工具】速来!!一篇文章十分钟教你如何使用Python第三方库basemap进行地图绘制相关推荐

  1. python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...

    鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频? 前言 半个月前,后台有个小伙伴问我,如何将视频中的音频提取出来,并且将声音转成文字写入到 word 中,正好接下来的 ...

  2. python 状态机第三方库,python 实用工具状态机transitions

    说明 1. 状态机是一个非常实用的理论.在涉及到复杂的场景,建立状态机模型,能带来极大的方便.比如,网络连接.模型状态.业务逻辑. 2. 状态机并不复杂, 重要的是它的思想,能够极大减轻复杂度.使用时 ...

  3. 【Python】【进阶篇】十二、Python爬虫的Xpath简明教程(十分钟入门)

    目录 十二.Python爬虫的Xpath简明教程(十分钟入门) 12.1 Xpath表达式 12.2 Xpath节点 12.3 节点关系 12.4 Xpath基本语法 12.4.1 基本语法使用 12 ...

  4. 视频教程-Python全栈9期(第十部分):CRM系统-Python

    Python全栈9期(第十部分):CRM系统 TriAquae开源运维软件创始人,混迹IT运维领域多年,曾就职于松下.国政通.飞信.中金.NOKIA等公司,维护过少至几十台,多至数万台设备的IT系统, ...

  5. 一分钟教你学会python_十分钟教你学会python编写小游戏

    原标题:十分钟教你学会python编写小游戏 看过,估计大家都已经精通了吧,好的,话不多说,今天就活学活用,用python来编写纸牌游戏21点,江湖人称黑杰克,BLACK JACK-(注意法式卷舌). ...

  6. python编写小游戏17_十分钟教你学会python编写小游戏

    原标题:十分钟教你学会python编写小游戏 看过,估计大家都已经精通了吧,好的,话不多说,今天就活学活用,用python来编写纸牌游戏21点,江湖人称黑杰克,BLACK JACK-(注意法式卷舌). ...

  7. 十分钟教你开发EOS智能合约

    十分钟教你开发EOS智能合约 在CSDN.柏链道捷(PDJ Education).HelloEOS.中关村区块链产业联盟主办的「EOS入门及最新技术解读」专场沙龙上,柏链道捷(PDJ Educatio ...

  8. 十分钟教你配置frp实现内网穿透

    十分钟教你配置frp实现内网穿透 一.frp的作用 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务. 对于 http, https 服务支持基于域名的虚拟主机,支持自定义 ...

  9. 十分钟教你掌握CPU缓存

    十分钟教你掌握CPU缓存 一. 基础知识 二. 缓存命中 三.缓存一致 四.程序性能 示例一 示例二 示例三 一. 基础知识    首先,大家都知道现在CPU的多核技术,都会有几级缓存,现在的CPU会 ...

最新文章

  1. cad打印样式ctb丢失_CAD制图软件中如何设置CAD打印样式表(CTB)?
  2. wxWidgets:wxVariantDataSafeArray类用法
  3. 人工智能不是计算机领域能学么,华南理工大学《高级人工智能》考试真题1
  4. spring学习记录(一)
  5. 统一的.NET文档体验发布
  6. 移动端上传大文件到服务器,android上传大文件到服务器地址
  7. python日历模块_Python日历模块| setfirstweekday()方法与示例
  8. php插入一个自增字段,thinkphp-自增或自减一个字段的值
  9. 如何看计算机几核,windows7系统怎么看CPU是几核的?win7查看CPU是几核的方法
  10. 微信开放平台_第三方平台授权流程_授权码
  11. 为UIView绘制单边的boder
  12. UVM中starting_phase
  13. spanning tree增强
  14. 低多边形,通过PS制作低多边形图形
  15. .NET Core 人工智能系列-概述
  16. ibm aix_IBM AIX SAN Volume Controller更新和迁移
  17. WordPress更新方法,防止 WP 官网 429 导致更新失败
  18. 大数据和云计算是如何结合
  19. TextView的居中显示、多行显示、单行显示且显示不完用省略号替代...
  20. Sql Server sql语句中发送电子邮件

热门文章

  1. 基于Multisim的红路灯电路设计
  2. 哪个CMS建站系统更利于seo优化
  3. c语言字符统计2sdut,山东理工大学SDUT - ACM OJ 题: Python代码 及分析
  4. 联想微型计算机怎么进入bios,联想怎么进入bios图文教程
  5. 微信开发者工具:代码更新后页面未刷新
  6. ssh登录极路由后台_十八聊智能 篇一百一十:搭建个人云盘,蒲公英企业级路由G5评测:个人私有云+企业异地组网两大杀手锏_路由器...
  7. Java实现 LeetCode 31下一个排列
  8. 利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止。
  9. 存储基础:DAS/NAS/SAN存储类型及应用
  10. python机器学习:决策树详解