r - 如何用锯齿形或斜线填充 ggplot geom_map 中的 NA 值?

标签 r ggplot2

enter image description here

我正在制作一张世界地图,用不同变量值的灰色阴影填充国家/地区。对于具有 NA 值的国家/地区,我想用之字形、斜线或影线填充它们。最终 map 将是黑白的,因此过多的灰色或彩色阴影不会产生可区分的结果。我想为因子变量 (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")

最佳答案

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

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

我看到@JonSpring 关于 ggtextures 的评论包(看起来它仍处于测试阶段)并开始摆弄它。诀窍在于,截至目前,ggtextures 只能生成条形和矩形,而不是填充 map 中缺失区域所需的更复杂的形状。

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

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

map1

将所有层加起来,并一起构建两个图例,一个用于缺少 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"))

map2

肯定还有一些您需要调整的地方,但希望这是一个开始。

关于r - 如何用锯齿形或斜线填充 ggplot geom_map 中的 NA 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58228137/

相关文章:

r - 为什么我的 ggplot2 条形图不显示大于 0 的 ylim 最小值?

从 ggplot2 的 Facet 中删除未使用的因素

r - r 中的哪些投影会使城市 map 变胖?

r - 数据框中每个唯一组合的频率

r - ggplot2交互图错误

c# - 从 shapefile 创建加权制图的算法(和工具)?

r - 尽管+ geom_line() 图表中没有线条

r - ggplot : extract selected subplots from faceted plot

r - 用格子绘制回归线

r - 如何计算R中矩阵中数字的变化?