gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:52:00 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com