如何在tmap中合并大小与颜色图例?
问题:合并tmap中点图层的大小与颜色图例
我用tmap生成地图,通过tm_symbols()叠加表示病例位置和数量的点,用点的大小对应病例数,同时用颜色刻度区分病例数。现在图例分成了大小和颜色两个,能不能像ggplot2那样把二者合并?
我的点图层代码:
tm_shape(dataplot) + tm_symbols( size = "Case count", col = "Case count", palette = "Reds", alpha = .5 )
相关图层信息(dput()输出):
tm_element object List of 18 $ layer : chr "symbols" $ trans.fun :function (shpTM, xmod = NULL, ymod = NULL, ord__, plot.order, args, scale) $ trans.aes : list() $ trans.args :List of 4 ..$ points_only: chr "ifany" ..$ point_per : chr "feature" ..$ on_surface : logi FALSE ..$ along_lines: logi FALSE $ trans.isglobal: logi FALSE $ mapping.aes :List of 8 ..$ size :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ fill :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ col :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ shape :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ lwd :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ lty :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ fill_alpha:List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" ..$ col_alpha :List of 6 .. ..- attr(*, "class")= chr [1:2] "tmapScale" "list" $ gpar :List of 11 ..$ fill : chr "__fill" ..$ col : chr "__col" ..$ shape : chr "__shape" ..$ size : chr "__size" ..$ fill_alpha: chr "__fill_alpha" ..$ col_alpha : chr "__col_alpha" ..$ lty : chr "__lty" ..$ lwd : chr "__lwd" ..$ linejoin : logi NA ..$ lineend : logi NA ..$ pattern : chr "fill" ..- attr(*, "class")= chr "tmapGpar" $ tpar : list() ..- attr(*, "class")= chr "tmapTpar" $ plot.order :List of 5 ..$ aes : chr "size" ..$ reverse : logi TRUE ..$ na.order : chr "mix" ..$ null.order : chr "bottom" ..$ null.below.na: logi TRUE ..- attr(*, "class")= chr "tm_plot_order" $ mapping.fun : chr "Symbols" $ mapping.args :List of 3 ..$ icon.scale: num 3 ..$ just : logi NA ..$ grob.dim : Named num [1:4] 48 48 256 256 .. ..- attr(*, "names")= chr [1:4] "width" "height" "render.width" "render.height" $ zindex : logi NA $ group : logi NA $ group.control : chr "check" $ popup.vars : logi NA $ popup.format : list() $ hover : logi NA $ id : chr "" - attr(*, "class")= chr [1:4] "tm_aes_layer" "tm_layer" "tm_element" "list"
解决方案
可以通过tmap的tm_add_legend()自定义复合图例,同时隐藏默认的大小和颜色图例,实现类似ggplot2的合并效果。具体操作如下:
- 第一步:在
tm_symbols()中关闭默认的大小和颜色图例; - 第二步:用
tm_add_legend()创建自定义图例,将点的大小和颜色绑定到同一个变量的取值上,匹配原图层的配色和大小映射规则。
修改后的代码示例:
# 提取病例数的唯一值并排序(根据实际数据调整) case_values <- sort(unique(dataplot$`Case count`)) # 生成与原palette匹配的颜色 case_colors <- scales::col_numeric("Reds", domain = range(dataplot$`Case count`))(case_values) tm_shape(dataplot) + tm_symbols( size = "Case count", col = "Case count", palette = "Reds", alpha = .5, legend.size.show = FALSE, # 隐藏默认大小图例 legend.col.show = FALSE # 隐藏默认颜色图例 ) + tm_add_legend( type = "symbol", labels = as.character(case_values), sizes = scales::rescale(case_values, to = c(1, 10)), # 调整点大小范围适配地图 col = case_colors, title = "Case count", alpha = .5 )
补充说明:
scales::rescale()用于将病例数原始值映射到合适的点尺寸区间,可根据地图显示效果修改to = c(1, 10)的数值;- 如果病例数是连续型数据,可选择分位数或固定间隔的取值生成图例项,让图例更简洁;
- 确保
case_colors的生成逻辑与tm_symbols()中的palette一致,保证图例颜色和地图点颜色匹配。
内容的提问来源于stack exchange,提问作者mk123
相关产品推荐
相关产品推荐

