r - 如何用锯齿形或斜线填充 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")
解决方案
这是一个非常老套的解决方案,可能需要进行一些调整。我切换到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")
将所有图层相加,并一起构建两个图例,一个用于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"))
肯定还有一些你想要调整的东西,但希望这是一个开始。
推荐阅读
- swift - 无法读取数据,因为它的格式不正确 Stripe
- c++ - 使用指针调整类数组的大小
- javascript - 使用 textarea 执行 Javascript 代码
- java - 从硒中的渲染器接收消息超时?
- python - 为什么模型方程输出与模型训练输出不匹配
- r - 有没有办法通过多组因素来总结?
- javascript - 在javascript中找到随机数的总和
- flutter - 错误:shared_preferences_platform_interface-1.0.3/pubspec.yaml:缺少必需的“名称”字段
- python - 定义新类时在 __init__ 内外引发 Python 异常
- accelerometer - 如何从加速度的三个轴分量中找到加速度大小的方向?