如何使用tmap为内嵌地图添加合适的比例尺
问题描述
使用tmap制作地图时,尝试为内嵌地图(inset map)添加比例尺但始终无法显示,相关代码如下:
main_map <- tmap::tm_shape(main_map_df) + tmap::tm_polygons( col = "var.q5", palette = c("#CCCCCC", "#999999", "#666666", "#333333", "#000000"), lwd = 0.5, title = "") + tmap::tm_layout( frame = FALSE, legend.outside = TRUE, legend.hist.width = 5, legend.text.size = 0.5, fontfamily = "Verdana") + tmap::tm_scale_bar( position = c("LEFT", "BOTTOM"), breaks = c(0, 10, 20), text.size = 0.5 ) + tmap::tm_compass(position = c("LEFT", "TOP")) inset_map <- tmap::tm_shape(inset_map_df) + tmap::tm_polygons() + tmap::tm_shape(main_map_df) + tm_fill("grey50") + tmap::tm_scale_bar( position = c("LEFT", "BOTTOM"), breaks = c(0, 10, 20), text.size = 0.5 ) # Combine crude rate map (inset + main) ===== tiff( "main_map_w_iset.tiff", height = 1200, width = 1100, compression = "lzw", res = 300 ) main_map print( inset_map, vp = viewport( x = 0.7, y = 0.18, width = 0.3, height = 0.3, clip = "off") ) dev.off()
解决方案
内嵌地图比例尺不显示的核心原因是未设置独立布局参数,且比例尺刻度可能与内嵌地图范围不匹配。可通过以下两点修改解决:
- 给内嵌地图添加
tm_layout,关闭边框和图例,确保元素适配内嵌尺寸 - 根据内嵌地图的实际范围调整比例尺刻度值(若内嵌是更大范围的地图,需放大刻度)
修改后的完整代码
main_map <- tmap::tm_shape(main_map_df) + tmap::tm_polygons( col = "var.q5", palette = c("#CCCCCC", "#999999", "#666666", "#333333", "#000000"), lwd = 0.5, title = "") + tmap::tm_layout( frame = FALSE, legend.outside = TRUE, legend.hist.width = 5, legend.text.size = 0.5, fontfamily = "Verdana") + tmap::tm_scale_bar( position = c("LEFT", "BOTTOM"), breaks = c(0, 10, 20), text.size = 0.5 ) + tmap::tm_compass(position = c("LEFT", "TOP")) inset_map <- tmap::tm_shape(inset_map_df) + tmap::tm_polygons() + tmap::tm_shape(main_map_df) + tm_fill("grey50") + tmap::tm_scale_bar( position = c("LEFT", "BOTTOM"), # 根据内嵌地图范围调整刻度,示例用0, 50, 100,可按需修改 breaks = c(0, 50, 100), text.size = 0.4 # 缩小文字适配内嵌尺寸 ) + tmap::tm_layout( frame = FALSE, legend.show = FALSE, # 内嵌地图不需要图例 fontfamily = "Verdana" ) # 组合地图并导出 tiff( "main_map_w_iset.tiff", height = 1200, width = 1100, compression = "lzw", res = 300 ) main_map print( inset_map, vp = grid::viewport( x = 0.7, y = 0.18, width = 0.3, height = 0.3, clip = "off" ) ) dev.off()
关键说明
- 内嵌地图的比例尺刻度必须匹配其实际地理范围:如果内嵌是比主图大得多的区域(比如主图是市区,内嵌是全省),用
0,10,20这类小刻度会导致比例尺无法正常渲染,需换成对应范围的刻度值。 tm_layout的legend.show=FALSE避免内嵌地图的图例干扰主图,同时减少布局冲突。- 缩小比例尺的
text.size,确保文字能完整显示在小尺寸的内嵌地图中。
内容的提问来源于stack exchange,提问作者Meo
相关产品推荐
相关产品推荐

