You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:03:11