将 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")
这个问题是标签在侧面,而不是顶部。我有时有更长的方面标签和方面的几行。这意味着小平面标签被切断。
ggforce 包中有一个解决方案(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")
但是,还有一些限制 ggplot2. For example, I ultimately want a two column figure, and this functionality does not seem possible with ggforce。有什么方法可以使用 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' 预期结果,我可以尝试采用这种方法看看它是否有效。
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")
这个问题是标签在侧面,而不是顶部。我有时有更长的方面标签和方面的几行。这意味着小平面标签被切断。
ggforce 包中有一个解决方案(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")
但是,还有一些限制 ggplot2. For example, I ultimately want a two column figure, and this functionality does not seem possible with ggforce。有什么方法可以使用 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' 预期结果,我可以尝试采用这种方法看看它是否有效。