1 前言
在推出一篇使用R-tmap绘制带有「指北针(compass)」 和「比例尺(scale bar)」 的教程图文哦,有很多小伙伴私信说“解决了好久没解决的问题,而且绘图语法和ggplot2相似”。能得到类似的回答,我也是很高兴的,最起码帮到了你们,让你们少走我之前走过的坑。同时也有小伙伴提出「能不能将南海九段线单独绘制,并放置在整幅图的右下角?」 起初我在查阅tmap官网时也确实发现了类似功能的绘图函数tm_minimap() 。
但在尝试 多次后始终无法实现。最终使用其他方法实现了该功能,也完美衔接tmap绘图体系。主要涉及到的知识点如下:
- tmap绘图函数实现主要图层的绘制。
- grid包实现南海小地图的的添加和位置调整。
2 tmap 绘制主要地图部分
南海小地图绘制
本部分的主要的绘图函数和之前的推文R-tmap绘制带有指北针和比例尺的空间地图 一样,此外,我们添加了单独绘制南海区域(即需要单独绘制的南海部分地图),主要代码如下:
代码语言:javascript复制//filename china_nanhai.R
nanhai <- tm_shape(country,xlim = c(107, 125),ylim = c(2.5, 26))
tm_lines(col="black", lwd = 2)
tm_shape(province)
tm_fill(col = "lightgrey")
tm_borders("grey60", lwd = 0.8)
tm_style("classic")
# tm_xlab("Longitude",size = 1)
# tm_ylab("Latitude",size = 1)
tm_credits("Visualization by DataCharm",size=.7,position = c(0.62, 0.02),fontface = "bold")
可视化结果如下: 使用「classic主题」
这也就是我们需要单独绘制的小地图。
中国地区地图绘制
和前篇推文唯一不同的是,我们限制的经纬度范围,代码不同之处如下:
代码语言:javascript复制// filename china_main.R
tm_shape(world,
xlim = c(75, 135),
ylim = c(15, 55))
tm_borders("grey40", lwd = 1.5)
tm_grid(labels.size = 1)
我们设置了xlim和ylim的范围。可视化结果如下: 使用「classic主题」
3 grid 包实现南海小地图添加
这里使用了grid包中的viewport() 函数实现该效果,其主要包含的参数设置如下:
- x:viewport()导出图中心点横坐标x值。
- y:viewport()导出图中心点纵坐标y值。
- width: viewport()部分的宽度。
- height: viewport()部分的长度。
绘制代码如下:
代码语言:javascript复制//Filename China_map_with_minimap.R
//@byDataCharm
library(grid)
map_test2 <- tm_shape(world,
xlim = c(75, 135),
ylim = c(15, 55))
tm_borders("grey40", lwd = 1.5)
tm_grid(labels.size = 1)
tm_shape(province)
tm_fill(col = "lightgrey")
tm_borders("grey60", lwd = 0.8)
tm_shape(country)
tm_lines(col="grey20", lwd = 1)
tm_shape(city)
tm_text("city", size=0.5)
#添加比例尺
tm_scale_bar(position=c("left", "bottom"),text.size = 0.5)
#添加指北针
tm_compass(type = "arrow", position=c("left", "top"),text.size = 1)
tm_xlab("Longitude",size = 1)
tm_ylab("Latitude",size = 1)
tm_credits("Visualization by DataCharm",size=.6,position = c(0.8, 0.02),fontface = "bold")
#tm_style("classic")
tm_style("beaver")
tm_layout(inner.margins=c(0.01,0.05,0.05,0.05))
nanhai <- tm_shape(country,xlim = c(107, 125),ylim = c(2.5, 26))
tm_lines(col="black", lwd = 2)
tm_shape(province)
tm_fill(col = "lightgrey")
tm_borders("grey60", lwd = 0.8)
tm_style("beaver")
#tm_style("classic")
vip_map <- viewport(0.89, 0.3, width = 0.28, height = 0.2)
tmap_mode("plot")
tmap_save(map_test2,filename = "F:\DataCharm\学术图表绘制\R-ggplot2\map charts\china_map_with_nh3.png",
width = 8,height = 7,dpi = 900, insets_tm = nanhai,
insets_vp = vip_map)
「知识点」
先看下tmap_save()函数的官网解释如下:
重点看下红框中的参数,官网解释如下:
再看下我们保存图片的代码:
代码语言:javascript复制tmap_save(map_test2,filename = "F:\DataCharm\学术图表绘制\R-ggplot2\map charts\china_map_with_nh3.png",
width = 8,height = 7,dpi = 900, insets_tm = nanhai,
insets_vp = vip_map)
具体结合上述代码即可。若直接打印出来,则使用如下代码:
代码语言:javascript复制library(grid)
map_test2
map_combin = print(nanhai, vp = viewport(0.82, 0.34, width = 0.25, height = 0.18))
最终添加南海小地图的结果如下:
其他主题的结果如下:
4 其他绘图包 cartography
大部分的空间地图可视化的绘制tmap包都可以实现,大家自行掌握就可以,这一部分我们再给大家推荐个功能强的R空间地图绘图包cartography 。这个包最吸引我的一点如下图中圆框所示,当然也是可以添加 指北针和比例尺的哦:
其他优秀的例子可以 直接去官网进行查看cartography当然,如果需求较多的化,我后期也会专门推出相应教程进行推文讲解。
5 总结
本期推文我们讲解了使用grid包结合tmap包进行南海小地图(minimap)的添加,当然类似的地图添加组合都是可以的。此外,我们大致介绍了另一个绘制空间地图强大的R包cartography。希望大家可以掌握技巧并尝试使用其他包进行绘制。能力有限,大家可以进群讨论交流哦,偷偷告诉你,群里的大牛是真多哦