首页 > 解决方案 > 如何用锯齿形或斜线填充 ggplot geom_map 中的 NA 值?

问题描述

在此处输入图像描述

我正在制作一张世界地图,为不同的变量值填充灰色阴影的国家。对于具有 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")

标签: rggplot2

解决方案


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

首先要做的是将值设为NA空白的地图——通过将NA值映射到 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()

首先,只是面具(可能更清洁):

ggplot(world) +
  geom_sf(data = world_inv, fill = "white")

地图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"))

地图2

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


推荐阅读