将 space 参数添加到 facet_wrap

Add space argument to facet_wrap

facet_wrap() 已被识别为没有 space = "free" 参数 (https://github.com/tidyverse/ggplot2/issues/2933)。这可能会导致绘图的 y 轴上出现间距问题。

使用以下代码创建上图:

library(tidyverse)

p <-
  mtcars %>%
  rownames_to_column() %>%
  ggplot(aes(x = disp, y = rowname)) + geom_point() +
  facet_wrap(~ carb, ncol = 1, scales = "free_y")
另一方面,

facet_grid 有一个 space = "free" 参数。允许很好的 y 轴间距。

使用以下代码创建上图:

p <-
  mtcars %>%
  rownames_to_column() %>%
  ggplot(aes(x = disp, y = rowname)) + geom_point() + 
  facet_grid(carb ~ ., scales = "free_y", space = "free_y")

这个问题是标签在侧面,而不是顶部。我有时有更长的方面标签和方面的几行。这意味着小平面标签被切断。

包中有一个解决方案(ilarischeinin 在 https://github.com/tidyverse/ggplot2/issues/2933 上的评论)。

p <-
  mtcars %>%
  rownames_to_column() %>%
  ggplot(aes(x = disp, y = rowname)) + geom_point()

p + ggforce::facet_col(vars(carb), scales = "free_y", space = "free")

但是,还有一些限制 . For example, I ultimately want a two column figure, and this functionality does not seem possible with 。有什么方法可以使用 facet_wrap() 产生相同的结果,以便我可以利用 ncol() 参数?

这是基于 的潜在解决方法:

library(tidyverse)
library(gtable)
library(grid)

p1 <- mtcars %>%
  rownames_to_column() %>%
  ggplot(aes(x = disp, y = rowname)) + geom_point() +
  facet_grid(carb ~ ., scales = "free_y", space = "free_y") +
  theme(panel.spacing = unit(1, 'lines'),
        strip.text.y = element_text(angle = 0))

gt <- ggplotGrob(p1)
panels <-c(subset(gt$layout, grepl("panel", gt$layout$name), se=t:r))
for(i in rev(panels$t-1)) {
  gt = gtable_add_rows(gt, unit(0.5, "lines"), i)
}
panels <-c(subset(gt$layout, grepl("panel", gt$layout$name), se=t:r))
strips <- c(subset(gt$layout, grepl("strip-r", gt$layout$name), se=t:r))
stripText = gtable_filter(gt, "strip-r")
for(i in 1:length(strips$t)) {
  gt = gtable_add_grob(gt, stripText$grobs[[i]]$grobs[[1]], t=panels$t[i]-1, l=5)
}
gt = gt[,-6]
for(i in panels$t) {
  gt$heights[i-1] = unit(0.8, "lines")
  gt$heights[i-2] = unit(0.2, "lines")
}
grid.newpage()
grid.draw(gt)

reprex package (v2.0.1)

于 2021-12-15 创建

我不清楚你所说的“我最终想要一个两列的数字”是什么意思,但如果你能想出一个例子来说明你的 'ultimate' 预期结果,我可以尝试采用这种方法看看它是否有效。