是否有办法以交互方式顺序添加更多ggplots到绘图窗口,类似于base
中您可以使用par(mfrow = ...)
添加更多绘图的方式。例如。 (for循环模拟顺序输入绘图命令):
par(mfrow = c(4, 1))
for (i in 1:4) {
plot(tmp_df$x, tmp_df$y)
}
依次生成以下图的第一行到最后一行:
然而,对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)
答案 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]])