ggplots的顺序绘图类似于par(mfrow = ...)?

时间:2017-07-17 06:57:30

标签: r plot ggplot2

是否有办法以交互方式顺序添加更多ggplots到绘图窗口,类似于base中您可以使用par(mfrow = ...)添加更多绘图的方式。例如。 (for循环模拟顺序输入绘图命令):

par(mfrow = c(4, 1))

for (i in 1:4) {
    plot(tmp_df$x, tmp_df$y)
}

依次生成以下图的第一行到最后一行:

enter image description here

然而,对ggplot执行相同操作只会将一个绘图打印到绘图窗口:

par(mfrow = c(4, 1))

for (i in 1:4) {
    plot(ggplot(tmp_df, aes(x, y)) +
        geom_point())

}

我已经知道如何使用gridExtra::grid.arrange来安排ggplots的列表,例如:

tmp_list <- list()
for (i in 1:4) {
    tmp_list[[length(tmp_list) + 1]] <-
        ggplot(tmp_df, aes(x, y)) +
        geom_point()

}

gridExtra::grid.arrange(grobs = tmp_list, nrow = 4)

2 个答案:

答案 0 :(得分:1)

您当然可以一次添加一个绘图,例如通过制作网格布局并按顺序绘制特定视口,

library(grid)
library(ggplot2)

gl <- replicate(4, ggplot(), F)

par <- function(mfrow = c(2,2)) pushViewport(viewport(layout = grid.layout(mfrow[1], mfrow[2])))
print.gg <- function(x) {
  rc <- which(matrix(1:4, 2, 2) == ii, arr.ind = TRUE)
  ggplot2:::print.ggplot(x, vp=viewport(layout.pos.row = rc[1,1], layout.pos.col = rc[1,2]))
  ii <<- (ii+1)%%4
}

grid.newpage()
par()
for(ii in seq_along(gl))
  print(gl[[ii]])

答案 1 :(得分:1)

这是一个带有gtable布局的版本,可以跟踪被占用的单元格,

library(grid)
library(ggplot2)
library(gtable)


par <- function(mfrow=c(2,2)) {
  nr <- mfrow[1]; nc <- mfrow[2]
  .g_layout <<- gtable(widths = unit(rep(1/nc, nc), "npc"), heights = unit(rep(1/nr, nr), "npc"))
}

print.gg <- function(x) {
  ntot <- prod(dim(.g_layout))
  ii <- (length(.g_layout) + 1) %% (ntot+1)
  rc <- which(matrix(seq_len(ntot), nrow = nrow(.g_layout), ncol = ncol(.g_layout)) == ii, arr.ind = TRUE)
  .g_layout <<- gtable::gtable_add_grob(.g_layout, ggplotGrob(x), t = rc[1,1], l = rc[1,2])
  grid.newpage()
  grid.draw(.g_layout)
}


gl <- replicate(4, ggplot(), F)

par()
for(ii in seq_along(gl))
  print(gl[[ii]])