空间地理数据可视化之 tmap 包及其拓展

2021-09-14 10:48:57 浏览数 (1)

前言

本篇 R 可视化将继续介绍 《Geospatial Health Data》[1] 中用 R 包制作地图的相关内容,使用的包是 tmap ,创建出来的图像多种多样、十分漂亮!

1. 基本画图设置

tmap 包被用来生成具有极大灵活性的专题地图,创建地图的语法类似于 ggplot2 ,这种地图是通过使用 tm_shape() 函数和用 tm_*() 函数添加图层来创建的。此外,我们可以通过分别设置 tmap_mode("plot")tmap_mode("view") 来创建静态或交互式地图。下面举出一个用 tmap 创建交互式地图的例子。

例子

代码语言:javascript复制
library(tmap)
tmap_mode("view") ##使用的数据是前两期用过的 map
tm_shape(map)   tm_polygons("SID74")

tmap 创建的1974年北卡罗来纳州婴儿猝死的地图

2. 内容扩展

tmap 包除了可以生成灵活的专题地图外,还允许创建具有多个形状和图层的可视化、创建分面等。

2.1 多个形状和图层

下面的一个例子是使用 tmap 包创建的一个多个形状和图层的世界地图,其中不同的颜色分布代表不同的海拔高度。

例子

代码语言:javascript复制
library(tmap)
data("World") ##加载数据

data(World, metro, rivers, land)

tmap_mode("plot") ##创建一个静态图

tm_shape(land)   ##添加形状
  tm_raster("elevation", palette = terrain.colors(10))  
  tm_shape(World)    ##添加形状
  tm_borders("blue", lwd = .5)  
  tm_text("iso_a3", size = "AREA")  
  tm_legend(show = TRUE)   ##添加图例
  tmap_options(check.and.fix = TRUE)

多个形状和图层的世界地图

2.2 创建分面

使用 tmap 创建分面主要有以下三种方式:

  1. 通过对 aesthetic 设置多个变量,在下面这个例子中是 tm_polygons 函数的第一个参数。

例子

代码语言:javascript复制
tmap_mode("view") ##创建一个交互式地图,可实现同步移动和放缩
tm_shape(World)  
  tm_polygons(c("income_grp", "life_exp"))  
  tm_facets(sync = TRUE, ncol = 2)

创建分面的第一种方式

在这个例子中,可通过地图的颜色分布初步观察到 income_grplife_exp 可能有一定的相关性。

  1. 通过使用 tm_facetsby 参数分割空间数据,下面这个例子是以省份为依据画出的各省男性人口所占比例的分面图。

例子

代码语言:javascript复制
tmap_mode("plot") ##创建一个静态图
data(NLD_muni) ##加载数据
## 展示部分数据
##code         name   province   population pop_men pop_women  pop_0_14  pop_15_24 pop_25_44
##0 0003   Appingedam Groningen      12065    5845      6215       15        11        22
##1 0005        Bedum Groningen      10495    5245      5245       17        12        21
##2 0007 Bellingwedde Groningen       8920    4450      4470       14        10        19
##3 0009     Ten Boer Groningen       7480    3730      3750       20        11        22
##4 0010     Delfzijl Groningen      25695   12860     12835       15        11        21
##5 0014    Groningen Groningen     198315   98425     99890       12        24        30

NLD_muni$perc_men <- NLD_muni$pop_men / NLD_muni$population * 100 ##定义要展示的变量

tm_shape(NLD_muni)  
  tm_polygons("perc_men", palette = "RdYlBu")  
  tm_facets(by = "province") ##按照省份分割数据画出分面图

创建分面的第二种方式

  1. 也可使用 tmap_arrange 函数创建分面图,下面这个例子是将同一数据分别创建关于人口的多边形图和气泡图。

例子

代码语言:javascript复制
tmap_mode("plot")
data(NLD_muni)
tm1 <- tm_shape(NLD_muni)   tm_polygons("population", convert2density = TRUE) ##创建多边形图分面
tm2 <- tm_shape(NLD_muni)   tm_bubbles(size = "population") ##创建气泡图分面

tmap_arrange(tm1, tm2)

创建分面的第三种方式

2.3 底图和覆盖图

底图可使用 tm_basemap 函数添加,半透明的覆盖图(例如注释、标签等)可使用 tm_tiles 函数添加。

代码语言:javascript复制
data("World") ##加载数据
tmap_mode("view")  ##创建一个交互式地图
tm_basemap("Stamen.Watercolor")   ##添加底图
  tm_shape(metro)   tm_bubbles(size = "pop2020", col = "red")   ## 画出城市点,气泡大小表示人口数
  tm_tiles("Stamen.TonerLabels") ##添加注释、标签

添加底图和覆盖图

放大版上图

3. 图像保存

使用 tmap_save() 函数保存 tmap 创建的图像,需要指定 HTML 文件(view 模式)或图像(plot 模式)的名称。

例如

代码语言:javascript复制
tm <- tm_shape(World)  
  tm_polygons("HPI", legend.title = "Happy Planet Index")

## save as stand-alone HTML file ("view" mode)
tmap_save(tm, filename = "world_map.html")

## save an image ("plot" mode)
tmap_save(tm, filename = "world_map.png")

小编有话说

  • 本篇主要介绍 《Geospatial Health Data》 一书中 tmap 包和函数的基本使用方法并进一步对其中的内容进行了扩展。
  • 本篇是空间地理数据可视化系列的第三期,主要由 林华师 制作。本系列的宗旨是带你系统学习如何使用 R 对空间地理数据进行可视化。下一期将会继续介绍 leaflet 包的使用,敬请期待。

参考资料

[1]

《Geospatial Health Data》: https://www.paulamoraga.com/book-geospatial/sec-spatialdataandCRS.html

推荐: 可以保存以下照片,在 b 站扫该二维码,或者 b 站搜索【庄闪闪】观看 Rmarkdown 系列的视频教程。Rmarkdown 视频新增两节视频(写轮眼幻灯片制作)需要视频内的文档,可在公众号回复【rmarkdown

0 人点赞