是否有为 tmap 中的符号设置最小大小的功能?
Is there a function to set a minimum size for symbols in tmap?
当 tm_bubbles
或 tm_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")
当 tm_bubbles
或 tm_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")