R语言tidyterra包中能否实现facet_grid自定义行列分面绘图?
在tidyterra中实现facet_grid分面布局
当然可以实现!核心思路是从栅格图层名中提取分组信息(你的场景里是A/B列、1/2行),将这些信息作为属性关联到栅格对象的每个图层,之后就能用facet_grid实现指定的分面布局。
方法1:给栅格添加图层属性(推荐)
利用tidyterra的add_lyr_attr()函数给栅格对象绑定图层级别的分组属性,直接配合geom_spatraster使用:
library(terra) library(ggplot2) library(tidyterra) # 创建示例栅格 x <- rast(array(data = rnorm(120,0,1), dim=c(5,5,4))) names(x) <- c("A_1", "B_1", "A_2", "B_2") # 提取分组信息并构建属性表 lyr_attrs <- data.frame( lyr = names(x), category = substr(names(x), 1, 1), # 提取A/B列标识 group = substr(names(x), 3, 3) # 提取1/2行标识 ) # 将属性关联到栅格 x <- add_lyr_attr(x, lyr_attrs) # 用facet_grid绘图 ggplot() + geom_spatraster(data = x) + facet_grid(group ~ category) + # 行=group,列=category scale_fill_viridis_c() # 可选:优化颜色映射
方法2:转为tidy数据框后分面
如果习惯用ggplot的常规栅格绘图逻辑,可将栅格转为tidy格式的数据框,拆分图层名后用geom_raster:
library(terra) library(ggplot2) library(tidyterra) library(tidyr) # 创建示例栅格 x <- rast(array(data = rnorm(120,0,1), dim=c(5,5,4))) names(x) <- c("A_1", "B_1", "A_2", "B_2") # 转为tidy格式并拆分分组信息 x_tidy <- as_tibble(x, xy = TRUE) %>% pivot_longer(-c(x, y), names_to = "lyr", values_to = "value") %>% separate(lyr, into = c("category", "group"), sep = "_") # 分面绘图 ggplot(x_tidy, aes(x, y)) + geom_raster(aes(fill = value)) + facet_grid(group ~ category) + coord_equal() + scale_fill_viridis_c()
两种方法都能实现你要的效果:行标注1、2,列标注A、B的栅格分面布局。
内容的提问来源于stack exchange,提问作者Dan B
相关产品推荐
相关产品推荐

