R语言 ggplot2中的面网格不规则

xt0899hw  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一些重复的测量数据,来自大小不一的队列。我想为单个受试者创建一个带有小平面的图,队列按行分组-本质上是一个不规则的小平面网格。

library(ggplot2)

set.seed(42)

n <- c(3, 4, 3)
k <- 5
y <- t(MASS::mvrnorm(sum(n), rep(0, k), diag(k) * 0.4 + 0.6))

d <- data.frame(
  subjid = c(col(y)),
  cohort = rep(rep(1:3, n), each = k),
  tpt = c(row(y)),
  y = c(y)
)
d$subjid <- sprintf("%d%02d", d$cohort, d$subjid)

head(d)
#>   subjid cohort tpt          y
#> 1    101      1   1 -1.3375592
#> 2    101      1   2 -1.0513184
#> 3    101      1   3 -0.3968382
#> 4    101      1   4 -1.5878445
#> 5    101      1   5 -1.2790463
#> 6    102      1   1 -0.3494143

我尝试了facet_wrap()facet_grid(),但结果都不令人满意。对于wrap,我最终将来自不同队列的受试者混合在行中:

ggplot(d, aes(tpt, y)) + geom_line() + facet_wrap(~ subjid, ncol = max(n))

对于网格,我最终使用了太多的面:

ggplot(d, aes(tpt, y)) + geom_line() + facet_grid(cohort ~ subjid)

我还尝试了拼凑,这让我得到了正确的分组,但不是跨行的面对齐。

library(patchwork)

lapply(unique(d$cohort), \(c) {
  d <- subset(d, cohort == c)
  ggplot(d, aes(tpt, y)) + geom_line() + facet_grid(cohort ~ subjid)
}) |> wrap_plots(ncol = 1)

如何在ggplot 2中创建不规则的面网格?

fjaof16o

fjaof16o1#

来自ggh4xfacet_manual()可以创建这样的布局。但是,首先需要手动创建网格布局:

library(ggh4x)

design_ragged_rows <- function(data, rows, cols) {
  facets <- unique(data[c(rows, cols)])
  facet_id <- seq_len(nrow(facets))
  
  groups <- split(facet_id, facets[rows], drop = TRUE)
  n <- lengths(groups)
  i <- rep(seq_along(n), n)
  j <- sequence(n)
  
  design <- matrix(NA_integer_, max(i), max(j))
  replace(design, cbind(i, j), facet_id)
}

design <- design_ragged_rows(d, "cohort", "subjid")
design
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3   NA
#> [2,]    4    5    6    7
#> [3,]    8    9   10   NA

ggplot(d, aes(tpt, y)) + geom_line() +
  facet_manual(vars(subjid), design = design)

可以使用strip参数添加队列条带(感谢@teunbrand):

ggplot(d, aes(tpt, y)) + geom_line() +
  facet_manual(
    vars(cohort, subjid),
    design = design,
    strip = strip_split(position = c("left", "top"))
  )

相关问题