我正在尝试将两个相邻面板的分面条组合在一起(始终有两个具有相同第一个ID变量但具有两种不同情况的相邻面板,让我们称它们为“A”和“B”)。我对我尝试的
通过组合顶部分面条来使基本图更易于阅读的最小可行示例如下:
gtable
+grid
解决方案并不是特别满意,但不幸的是,我不能使用ggh4x
包中的facet_nested()
(由于存在各种限制和所需的依赖项,我无法在公司服务器上安装它——我尝试只使用相关代码,但由于依赖关系,这也不容易)。通过组合顶部分面条来使基本图更易于阅读的最小可行示例如下:
library(tidyverse)
library(gtable)
library(grid)
idx = 1:16
p1 = expand_grid(id=idx, id2=c("A", "B"), x=1:10) %>%
mutate(y=rnorm(n=n())) %>%
ggplot(aes(x=x,y=y)) +
geom_jitter() +
facet_wrap(~id + id2, nrow = 4, ncol=8)
“1”所在的条带,“2”所在的条带等应合并(实际上,这是一段稍长的文本,但仅用于说明)。我试图修改类似情景的答案(https://dev59.com/bFkS5IYBdhLWcg3wJDYP#40316170 - 感谢@markus再次找到它),但这就是我尝试过的。如下所示,我生成的高度似乎有误。我认为这可能是我正在忽略/不理解的一些琐碎的事情。# Combine strips for a ID
g <- ggplot_gtable(ggplot_build(p1))
strip <- gtable_filter(g, "strip-t", trim = FALSE)
stript <- which(grepl('strip-t', g$layout$name))
stript2 = stript[idx*2-1]
top <- strip$layout$t[idx*2-1]
# # Using the $b below instead of b = top[i]+1, also seems not to work
#bot <- strip$layout$b[idx*2-1]
l <- strip$layout$l[idx*2-1]
r <- strip$layout$r[idx*2]
mat <- matrix(vector("list",
length = length(idx)*3),
nrow = length(idx))
mat[] <- list(zeroGrob())
res <- gtable_matrix("toprow", mat,
unit(c(1, 0, 1), "null"),
unit( rep(1, length(idx)),
"null"))
for (i in 1:length(stript2)){
if (i==1){
zz <- res %>%
gtable_add_grob(g$grobs[[stript2[i]]]$grobs[[1]], 1, 1, 1, 3) %>%
gtable_add_grob(g, .,
t = top[i],
l = l[i],
b = top[i]+1,
r = r[i],
name = c("add-strip"))
} else {
zz <- res %>%
gtable_add_grob(g$grobs[[stript2[i]]]$grobs[[1]], 1, 1, 1, 3) %>%
gtable_add_grob(zz, .,
t = top[i],
l = l[i],
b = top[i]+1,
r = r[i],
name = c("add-strip"))
}
}
grid::grid.draw(zz)
------------ 使用ggh4x实现的更新 -----------------
这可能可以解决许多类似问题,但也有其缺点(例如,跨行轴对齐变得有些手动化,可能需要手动删除x轴并确保限制相同,添加统一的y轴标签,需要从github安装一个软件包:devtools :: install_github(“teunbrand / ggh4x@v0.1”)
特定版本,加上cowplot与ggtern等存在互动问题)。因此,如果有人仍然能够做出纯粹的gtable
+ grid
版本,那就太好了。
library(tidyverse)
library(ggh4x)
library(cowplot)
plots = expand_grid(id=idx, id2=c("A", "B"), x=1:10) %>%
mutate(y=rnorm(n=n()),
plotrow=(id-1)%/%4+1) %>%
group_by(plotrow) %>%
group_map( ~ ggplot(data=.,
aes(x=x,y=y)) +
geom_jitter() +
facet_nested( ~ id + id2, ))
plot_grid(plotlist = plots, nrow = 4, ncol=1)
facet_wrap()
版本,但分面代码编程太可怕了,所以我决定推迟它,直到有人开始要求它。无论如何,如果您无法安装新的附加组件,这也无法解决您的问题。 - teunbrandggh4x
方法更新问题的实现。 - Björn