有没有办法将 facet.grid 类型的条带标签添加到常规绘图中,以便 grid.extra 中聚合的绘图匹配?

Is there a way to add facet.grid-type strip labels to regular plots so that plots aggregated in grid.extra match?

提问人:Jade131621 提问时间:3/24/2022 更新时间:12/8/2022 访问量:509

问:

据我所知,facet_grid的一大缺点是无法指定面板组的轴限制。因此,我创建了四个图形,添加了我想要的轴限制,并使用 gridExtra 包中的 grid.arrange 手动将它们添加在一起。但是,我想知道这些图是否与我使用 face_grid 创建的其他图相匹配。我认为在 facet_grid 中自动生成的条形标签在条带下的 theme() 中控制。相关功能,但我不知道如何为我的个人地块“重新创建”这些条带标签。有人知道吗?

这是我用 grid.arrange() 创建的图表enter image description here

这是我用 facet.grid() 创建的图表

enter image description here

我想要在我的 grid.arrange() 生成的图中来自 facet.grid() 的灰色阴影标签。

谢谢!

r ggplot2 gridextra facet-grid strip-tags

评论

0赞 MrFlick 3/24/2022
如果包含一个简单的可重现示例和示例输入,则更容易为您提供帮助,该示例输入可用于测试和验证可能的解决方案。
0赞 r2evans 3/24/2022
通过一点点工作(主要由 stackoverflow.com/q/63550588/3358272 支持),您可以对 的每个 facet/group 应用不同的轴限制。facet_grid

答:

0赞 stefan 3/24/2022 #1

好吧,一个简单的方法是通过添加 .这样做会自动将条带文本框添加到每个子图中。在下面的代码中,我使用了一个自定义函数,并使用 .facet_gridfacet_gridif-else

使用一些虚假的示例数据并使用 代替 :patchworkgrid.arrange

df <- data.frame(
  row = c("K", "r"),
  col = rep(c("Female", "Male"), each = 2),
  x = rep(1:2, each = 4),
  y = rep(1:2, each = 4)
)

# Split by facet row and col
df_split <- split(df, ~row + col)
# Order
df_split <- df_split[c("K.Female", "K.Male", "r.Female", "r.Male")]

plot_fun <- function(x, y) {
  facet_layer <- if (grepl("Female$", y) && !grepl("^r", y)) 
    facet_grid(.~col) 
  else if (grepl("Male$", y) && !grepl("^r", y)) 
    facet_grid(row~col)
  else if (grepl("Male$", y) && grepl("^r", y)) 
    facet_grid(row~.)
  
  ggplot(x, aes(x, y)) +
    geom_point() +
    facet_layer
}

library(purrr)
library(ggplot2)
library(patchwork)

purrr::imap(df_split, plot_fun) %>% 
  wrap_plots() 

0赞 Clem Snide 12/8/2022 #2

当您要求手动添加条带时(我寻找相同的条带,无法分面我的数据),以下解决方法:只需在白色矩形上方手动添加带有分组/因子名称的文本

  annotate("rect", xmin = 0.8, xmax = 3.5, ymin = 29, ymax = 33,
           color="black", fill = "white")+ 
  annotate(label = "something", x= 2.15, y=31, geom="text") +
  annotate("rect", xmin = 3.9, xmax = 6.5, ymin = 29, ymax = 33,
           color="black", fill = "white")+ 
  annotate(label = "something different", x= 5.25, y=31, geom="text")

你必须稍微摆弄一下定位。只要有可能,我也会使用前面提到的自动刻面。