使用tmap包创建范围指示器嵌入地图的布局控制问题
tmap嵌入地图边框与尺寸控制问题解决
问题描述
我想用tmap包创建带范围指示器的嵌入地图,展示区域全景,但在控制嵌入地图的边框和尺寸时遇到了麻烦。试过各种相关参数设置,始终没法让嵌入区域贴合地图,调整尺寸时边距/内边距还会影响布局——就算把这些组件设为不可见,它们还是会干扰整体布局。
效果示例:
解决方案
核心问题是转成grob的嵌入地图保留了原布局的隐性空白,且tm_inset的尺寸参数需要和地图本身的宽高比精准匹配。以下是修正后的代码:
library(sf) library(tmap) library(tidyverse) library(maptiles) library(tmaptools) # 加载数据 nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE) nc_sub <- nc %>% filter(NAME %in% c("Clay")) nc_sub_bound <- nc_sub %>% st_bbox() %>% st_as_sfc() %>% st_as_sf() # 获取底图 nc_basemap <- get_tiles(nc, provider = "Esri.WorldTopoMap", crop = T, zoom = 8) nc_sub_basemap <- get_tiles(nc_sub, provider = "Esri.WorldTopoMap", crop = T, zoom = 12) # 主地图(局部区域) nc_sub_map <- tm_shape(nc_sub_basemap) + tm_rgb(options = opt_tm_rgb(interpolate = T)) + tm_shape(nc_sub) + tm_polygons(fill_alpha = 0, lwd = 2) + tm_layout( margins = c(0,0,0,0), outer.margins = c(0,0,0,0), inner.margins = c(0,0,0,0), asp = get_asp_ratio(nc_sub), legend.show = FALSE, frame = FALSE ) # 嵌入地图(全景区域) nc_map <- tm_shape(nc_basemap) + tm_rgb(options = opt_tm_rgb(interpolate = T)) + tm_shape(nc) + tm_polygons(fill_alpha = 0) + tm_shape(nc_sub_bound) + tm_borders(col = "red", lwd = 2) + tm_layout( margins = c(0,0,0,0), outer.margins = c(0,0,0,0), inner.margins = c(0,0,0,0), asp = get_asp_ratio(nc), legend.show = FALSE, frame = FALSE, title.show = FALSE ) # 转换为grob时直接指定尺寸消除空白 inset_asp <- get_asp_ratio(nc) inset_grob <- tmap_grob(nc_map, width = unit(1, "npc"), height = unit(1, "npc")) # 组合地图,使用相对尺寸定位嵌入图 final_map <- nc_sub_map + tm_inset( inset_grob, position = c("right", "top"), width = 0.3, # 占主地图宽度的30% height = 0.3 / inset_asp, # 根据宽高比计算高度 frame.lwd = 1, bg.alpha = 0 ) # 保存地图 tmap_save(final_map, filename = "nc_map_with_inset.png", width = 10, height = 10, units = "in", dpi = 300)
关键修改点
- 为嵌入地图添加
legend.show = FALSE、frame = FALSE、title.show = FALSE,彻底关闭所有可能产生空白的元素 - 使用
tmap_grob时通过width = unit(1, "npc")和height = unit(1, "npc")强制grob填满容器,消除隐性空白 - 在
tm_inset中使用相对尺寸(0.3代表占主地图30%宽度),并根据嵌入地图的宽高比计算对应高度,确保比例匹配 - 主地图同样关闭不必要的边框和图例,避免整体布局偏移
内容的提问来源于stack exchange,提问作者BEVAN
相关产品推荐
相关产品推荐

