关于tmap包的两个技术问题:分置图例与外部添加Logo
tmap包相关问题解决方案
问题1:分别在地图左右两侧放置不同图例
可以通过tm_layout()的legend.position参数传入位置列表,分别指定颜色图例和数字(大小)图例的位置。示例代码如下:
library(tmap) library(sf) # 模拟示例数据 set.seed(123) df <- st_as_sf( data.frame( x = rnorm(26), y = rnorm(26), color_group = sample(c("组1", "组2"), 26, replace = TRUE), num_value = sample(1:10, 26, replace = TRUE) ), coords = c("x", "y") ) # 绘制地图并设置左右图例 tm_shape(df) + tm_dots( col = "color_group", # 颜色对应分组变量 size = "num_value", # 大小对应数字变量 legend.col.show = TRUE, legend.size.show = TRUE ) + tm_layout( # 第一个元素对应颜色图例位置,第二个对应数字大小图例位置 legend.position = list(c("left", "center"), c("right", "center")), legend.title.size = 1, legend.text.size = 0.8 )
legend.position接受坐标向量(c(x, y),取值0-1或"left"/"right"/"center"等)组成的列表,列表长度需与图例数量匹配,以此实现不同图例的分位置摆放。
问题2:将机构Logo放置在地图bbox外部(下方)
tmap::tm_logo()默认会将Logo置于地图内部,可结合grid包的视口(viewport)或gridExtra包的布局工具,将Logo手动定位到地图下方的外部区域。
方法1:使用grid包手动添加
library(tmap) library(grid) library(png) # 绘制地图时预留底部外边距 map <- tm_shape(df) + tm_dots(col = "color_group", size = "num_value") + tm_layout( outer.margins = c(0.1, 0, 0.2, 0) # 底部预留20%的外边距空间 ) # 先绘制地图 tmap_draw(map) # 读取并绘制Logo到底部中心位置 logo_img <- readPNG("your_logo.png") logo_grob <- rasterGrob(logo_img, width = unit(0.2, "npc"), height = unit(0.1, "npc")) pushViewport(viewport(x = 0.5, y = 0.05, just = c("center", "bottom"))) grid.draw(logo_grob) popViewport()
方法2:使用tmap_arrange上下布局
library(tmap) library(gridExtra) library(png) # 绘制主地图 map <- tm_shape(df) + tm_dots(col = "color_group", size = "num_value") # 将Logo转为grob对象 logo_img <- readPNG("your_logo.png") logo_grob <- rasterGrob(logo_img, width = unit(0.8, "npc"), height = unit(0.1, "npc")) # 上下排列地图和Logo,调整高度比例 tmap_arrange(map, logo_grob, nrow = 2, heights = c(4, 1))
两种方法都能让Logo避开地图区域,固定在下方外部位置。
内容的提问来源于stack exchange,提问作者Inês Moreno
相关产品推荐
相关产品推荐

