在R中使用cowplot使ggplot图表占用连续的两行

10

这是我的代码:

library(ggplot2)
library(cowplot)


df <- data.frame(
  x = 1:10, y1 = 1:10, y2 = (1:10)^2, y3 = (1:10)^3, y4 = (1:10)^4
)

p1 <- ggplot(df, aes(x, y1)) + geom_point()
p2 <- ggplot(df, aes(x, y2)) + geom_point()
p3 <- ggplot(df, aes(x, y3)) + geom_point()
p4 <- ggplot(df, aes(x, y4)) + geom_point()
p5 <- ggplot(df, aes(x, y3)) + geom_point()
# simple grid
plot_grid(p1, p2, 
          p3, p4,
          p5, p4)

但我不想重复 p4,我想要将p4“拉伸”以占用col2和第2、3行。

有任何帮助吗?


2
cowplot 是否必要?patchwork 包可能会有所帮助。 - Peter
2个回答

9

你可以尝试使用 gridExtra::grid.arrange() 来简化。

library(gridExtra)

grid.arrange(p1, p2, p3, p4, p5, 
             ncol = 2, 
             layout_matrix = cbind(c(1,3,5), c(2,4,4)))

结果:

输入图像描述


7

使用 patchwork 包非常简单明了。

另外,不要忘记 facet 选项 - 这需要使用 ggh4x 包。

最后,还有期望的 cowplot 解决方案,它需要将多个 plot_grid 对象复杂嵌套。 不是我喜欢的。

## Option 1 - patchwork 

library(ggplot2)
library(patchwork)

df <- data.frame(
  x = 1:10, y1 = 1:10, y2 = (1:10)^2, y3 = (1:10)^3, y4 = (1:10)^4
)
## patchwork allows working with lists, which I find neat. 
make_p <- function(y){
  ggplot(df, aes(x, !!sym(y))) + geom_point()
}

## custom layout grid
layout <- "
AB
CD
ED
"

ls_p <- lapply(paste0("y", c(1:4,3)), make_p)

wrap_plots(ls_p) + plot_layout(design = layout)

在您的特定示例中,另一个选项是利用 ggh4x::facet_manual

## Option 2 - faceting with ggh4x
library(tidyverse)
library(ggh4x)

df <- data.frame(
  x = 1:10, y1 = 1:10, y2 = (1:10)^2, y3 = (1:10)^3, y4 = (1:10)^4,
  ## adding y5 for simplicity
  y5 = (1:10)^3
)

design <- "
AB
CD
ED
"
## or you can pass a matrix as design argument
# design <- matrix(c(1,2,3,4,5,4), 3, 2, byrow = TRUE)

df %>% 
  pivot_longer(matches("^y")) %>%
  ggplot(aes(x, value)) + 
  geom_point() +
  facet_manual(~ name, design)

最后,cowplot选项。
## option 3 nesting plot_grids with cowplot
library(cowplot)
p1 <- ggplot(df, aes(x, y1)) + geom_point()
p2 <- ggplot(df, aes(x, y2)) + geom_point()
p3 <- ggplot(df, aes(x, y3)) + geom_point()
p4 <- ggplot(df, aes(x, y4)) + geom_point()
p5 <- ggplot(df, aes(x, y3)) + geom_point()

top_row <- plot_grid(p1, p2)
left_col <- plot_grid(p3, p5, ncol = 1)
bottom_panel <- plot_grid(left_col, p4, ncol = 2)

plot_grid(top_row, bottom_panel, ncol = 1)


1
感谢您的认可,tjebo!(我模糊地记得 facet 选项也采用与 patchwork 相同的基于文本的布局设计) - teunbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接