(R 中的 tmap 包)过滤 tm_text 内的值

(tmap package in R) Filtering values within tm_text

我想根据数据过滤器显示 tm_text 选项。举个例子:

tm_shape(World) + 
tm_polygons("HPI") +
tm_text("name", size = "AREA")

这会显示每个功能的文本。但是假设我只想显示 HPI 值大于 30 的国家/地区的文本。我希望 tm_text 中可以有一个参数,例如 tm_text(..., filter = "HPI" > 30), 但我看不到任何类似的东西。我能想到的唯一方法是创建另一层:

tm_shape(World) + 
tm_polygons("HPI") +
tm_shape(World %>% filter(HPI > 30)) +
tm_text("name", size = "AREA")

语法很好,直观,除了颜色之外,文本是我想要的;注意现在文本的颜色是全黑的。在第一个示例中,它在较暗的多边形上显示白色字体。我唯一的理由是第二层不是多边形颜色的 "aware",因为它们在另一层中。

我认为可能可行的另一种方法是根据过滤器在数据中包含一个变量。

World <- World %>% mutate(FLAG = if_else(HPI > 30, 1, 0)
tm_shape(World) +
tm_polygons("HPI") +
tm_text("name", size = "FLAG")

位置和颜色就在这里,但忽略了我不想在我的数据中到处都是标志变量这一事实,现在大小不正确,因为我将它用作一种 hacky 过滤方式。也请忽略某些文本在白色时不可见的事实;显然我会更改背景颜色,这是一个示例,在我的地图中,文本将在背景上可见)。

所以总而言之,我想问的是是否有一种方法可以实现第二张地图的文本大小 + 位置,但第一张地图的颜色(如果可能的话,无需编辑数据).

在我看来,最简单的解决方案是修改 name 变量创建另一个变量,如果 HPI >= 30 则等于名称,否则为空字符向量。例如:

# packages
library(tmap)
library(dplyr)

# data
data("World")

# modify name column according to HPI
World <- World %>% 
  mutate(new_name = ifelse(HPI >= 30, as.character(name), ""))

# plot
tm_shape(World) + 
  tm_polygons("HPI") +
  tm_text("new_name", size = "AREA")

reprex package (v0.3.0)

于 2020-05-14 创建