下载本文的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))
|
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))
|