R-tmap+grid 实现南海小地图的添加

2021-02-22 15:20:11 浏览数 (1)

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。希望大家可以掌握技巧并尝试使用其他包进行绘制。能力有限,大家可以进群讨论交流哦,偷偷告诉你,群里的大牛是真多哦

0 人点赞