用tmap程序包绘制各省植物标本数量

下载本文的Rmarkdown源代码以及数据

herbarium_records.xlsx

tmap.Rmd

在R中绘制地图原本是困难的。困难之处在于绘图的组件分散于不同程序包中,而每个程序包只能实现一部分功能:有些只能实现投影转换, 有些只能添加指北针或比例尺,有些只能处理栅格数据, 能够导入shape文件的,又不能实现渲染……不难想象,在R中绘制地图,需要多么熟悉流程,并记住多少命令。

不过tmap包诞生之后,上述困难都已成为过去。一切原来可以如此简单……

tmap的语句类似于ggplot2,但是其调用方式更符合传统R用户的习惯, 即通过参数控制图层的效果。除了在设定投影上较为不便之外,其他功能,如数据读取,图像保存,渲染,添加比例尺和指北针,添加坐标点,添加图例以及对各图层的控制,都是用户梦寐以求的。

下面的代码用于绘制广西植物所研究所标本馆2008年各省份标本数的空间分布。读者可借此了解tmap命令的简洁与优雅:

省份province 植物标本数n_specimens
河北 1612
山西 823
内蒙古 269
辽宁 1754
吉林 794
黑龙江 610
江苏 532
浙江 505
安徽 480
福建 998
江西 4264
山东 231
河南 716
湖北 1192
湖南 8143
广东 27425
广西 100372
海南 17514
四川 13672
贵州 3296
云南 8944
西藏 112
陕西 4024
甘肃 756
新疆 662
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
setwd("C:/Users/jlzhang/Desktop/New folder (2)")
#### 导入所需要的程序包
library(openxlsx)
library(rgdal)
library(dplyr)
library(tmap)
library(tmaptools)
rm(list = ls())
## 删除所有对象
## 广西植物研究所各省标本记录 (林春蕊等 2008)
nspecimens <- read.xlsx("herbarium_records.xlsx")## 读取地图
country <- readOGR("bou1_4l.shp") ## 国界
province <- readOGR("province_polygon.shp") ## 省界
province$ID <- as.character(province$ID)
## 默认为WGS84坐标系,
## 如果shp文件自带投影文件, 则读取投影文件
# 更多投影参见
# 指定 EPSG 编号即可
# 注意:生成的图形采用西安80坐标系,高斯-克吕格投影,指北针的方向并不指向正北

country <- set_projection(country, projection = 2343) ## 西安80坐标系,高斯-克吕格投影
province <- set_projection(province, projection = 2343) ## 西安80坐标系,高斯-克吕格投影

province2 <- left_join(province, nspecimens, by=c("ID" = "province_cn"))

tm_shape(country) +
tm_lines() +
tm_shape(province2) +
tm_fill("n_specimens",
breaks = c(500, 1000, 5000, 10000, 50000, 100000, 150000),
title ="Number of specimens") +
tm_borders(col = "gray40", lwd = 1) +
tm_scale_bar(position=c("left", "bottom")) +
tm_compass(type = "4star", position=c("left", "top")) +
tm_layout(inner.margins=c(0.12,0.03,0.08,0.03))

img

1
2
3
4
5
6
7
8
9
10
11
12
tm_shape(country) + 
tm_lines(col="dodgerblue3") +
tm_shape(province2) +
tm_bubbles("n_specimens",
border.col = "black", border.alpha = .5,
style="fixed",contrast=1,
title.size="Number of specimens",
col = "red") +
tm_borders("grey40", lwd = 1) +
tm_scale_bar(position=c("left", "bottom")) +
tm_compass(type = "4star", position=c("left", "top")) +
tm_layout(inner.margins=c(0.12,0.03,0.08,0.03))

img