是否有为 tmap 中的符号设置最小大小的功能?

Is there a function to set a minimum size for symbols in tmap?

tm_bubblestm_symbols 用于创建代表我的数据的气泡或点时,使用 size="data column of my choice" 分类,我遇到了一个问题,我的数据集中的数字非常小(假设 n=2,我的范围是 10,2000),代表 x1=2000 的气泡在屏幕上非常明显,但是 x2=10 太小了,我几乎看不到它。我需要的是一个为气泡设置 size.minimum 的函数。有没有人找到解决这个问题的方法?或者我们可以为符号创建类似 size.minimum 函数的东西吗?

目前是这样的:

library(tidyverse)
library(tmap)
library(sf)
data("World")

df_dummy <- tibble(size = c(10, 200, 2000), 
                   points = c(st_sfc(st_point(c(-30,20))), 
                              st_sfc(st_point(c(7,52))),
                              st_sfc(st_point(c(30,5))))) %>% 
  st_as_sf()

tm_shape(World) +
  tm_fill(col = "gray") +
tm_shape(df_dummy) +
  tm_bubbles(col = "red",
             size = "size")

选项 1

如果您现在添加一个 df_dummy`<- df_dummy %>% mutate(size = log10(size)),您的数据缩放比例不同,因为我们使用 log10 函数。当然,您丢失了图例中有关“原始”值的信息,但所有符号都是可见的:

选项 2

或者,您可以简单地生成一个新列,其中所有低于定义限制的值都会收到一个特定的大小值(例如,所有低于 100 的值都会收到 100 的大小)。通过这种方式,所有低于此限制的值都将被裁剪为一个,然后可以将其用作您的尺寸参数。在以下示例中,原始大小为 10、50 和 80 的点统一绘制为裁剪大小为 100。在自定义图例中,它们被标签 <= 100.

覆盖
df_dummy <- tibble(size = c(10, 50, 80, 500, 2000), 
                   points = c(st_sfc(st_point(c(-30,20))), 
                              st_sfc(st_point(c(7,52))),
                              st_sfc(st_point(c(10,45))),
                              st_sfc(st_point(c(15,35))),
                              st_sfc(st_point(c(30,5))))) %>% 
  mutate(size = ifelse(size <= 100, 100, size)) %>% 
  st_as_sf()

# see the tm_bubbles docs regarding the applied scaling
bubble_sizes <- ((c(100, 500, 1000, 1500, 2000)) / 2000) ^ 0.5 * 2 

tm_shape(World) +
  tm_fill(col = "gray") +
tm_shape(df_dummy) +
  tm_bubbles(col = "red",
             size = "size",
             scale = 2,
             border.col = "black",
             legend.size.show = F,  
                 legend.col.show = F) +
  tm_add_legend("symbol",
                size = bubble_sizes,
                col = "red",
                labels = c("<= 100","500","1000","1500", "2000"),
                title = "custom legend")