如何使用锯齿形或斜线在 ggplot geom_map 中填充 NA 值?

Sal*_*rif 1 r ggplot2

在此处输入图片说明

我正在制作一张世界地图,为不同的变量值用灰色阴影填充国家。对于具有 NA 值的国家/地区,我想用锯齿形、斜线或阴影线填充它们。最终的地图将是黑白的,因此太多的灰色或彩色阴影不会产生可区分的结果。我希望因子变量 (0-3) 的值具有不同的灰色阴影,以及 NA 值的模式。现在,代码为 na.value 显示“蓝色”,但它必须更改。

ggplot(CRSVmap, aes(map_id = region, fill = as.factor(SV)))+
geom_map(map = CRSVmap,  color = "black")+  
scale_fill_grey(start = 0.99, end = 0.1, na.value = "blue")
Run Code Online (Sandbox Code Playgroud)

cam*_*lle 5

这是一个非常棘手的解决方案,可能需要进行一些调整。我切换sf到 使一些空间操作更容易。

要做的第一件事是NANA值设为空白——通过将值映射到 alpha 并将该 alpha 设置为 0 来实现。

我看到了 @JonSpring 对这个ggtextures包的评论(看起来它仍然处于测试阶段)并开始弄乱它。诀窍是,截至目前,ggtextures只制作条形和矩形,而不是填充地图中缺失区域所需的更复杂的形状。

相反,制作一个与整个地图大小相同的矩形并用纹理填充它(我在这里制作了一个小的影线 SVG 文件)。最重要的是,添加一个图层来掩盖水域 - 否则纹理将通过那里显示。我通过获取地图边界框和陆地区域之间的空间差异来制作蒙版。

library(ggplot2)
library(dplyr)
library(sf)
library(ggtextures)

data(wrld_simpl, package = "maptools")

set.seed(10)
world <- st_as_sf(wrld_simpl) %>%
  select(name = NAME, geometry) %>%
  mutate(value = sample(c(letters[1:4], NA), size = nrow(.), replace = T))
world_bbox <- st_bbox(world)
world_inv <- st_difference(st_as_sfc(world_bbox), st_union(world)) %>%
  st_combine()
Run Code Online (Sandbox Code Playgroud)

首先,只是面具(可能更干净):

ggplot(world) +
  geom_sf(data = world_inv, fill = "white")
Run Code Online (Sandbox Code Playgroud)

地图1

将所有图层相加,并一起构建两个图例,一个用于NA丢失的颜色,一个用于NA标记的图像。

pattern <- tibble(
  xmin = world_bbox$xmin, xmax = world_bbox$xmax, ymin = world_bbox$ymin, ymax = world_bbox$ymax,
  image = "diagonals"
)

ggplot(world) +
  geom_textured_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, image = image),
    data = pattern, img_width = unit(0.8, "in"), img_height = unit(0.8, "in")) +
  geom_sf(aes(fill = value, alpha = is.na(value))) +
  geom_sf(data = world_inv, fill = "white") +
  scale_fill_grey(breaks = letters[1:4]) +
  scale_alpha_manual(values = c("TRUE" = 0, "FALSE" = 1), guide = NULL) +
  scale_image_manual(values = c("diagonals" = "hatching.svg"), name = NULL, labels = c("NA"))
Run Code Online (Sandbox Code Playgroud)

地图2

当然还有一些你想要调整的东西,但希望这是一个开始。