You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:44:57