Điều này được đăng chéo trên nhóm google ggplot2
Tình huống của tôi là tôi đang làm việc trên một hàm xuất ra một số lượng ô tùy ý (tùy thuộc vào dữ liệu đầu vào do người dùng cung cấp). Hàm trả về một danh sách gồm n ô và tôi muốn sắp xếp các ô đó thành hình 2 x 2. Tôi đang vật lộn với các vấn đề đồng thời của:
- Làm thế nào tôi có thể cho phép tính linh hoạt được giao một (n) số ô tùy ý?
- Làm cách nào tôi cũng có thể chỉ định tôi muốn chúng được bố trí 2 x 2
Chiến lược hiện tại của tôi sử dụng grid.arrange
từ gridExtra
gói. Nó có lẽ không phải là tối ưu, đặc biệt là vì, và đây là chìa khóa, nó hoàn toàn không hoạt động . Đây là mã mẫu được nhận xét của tôi, thử nghiệm với ba âm mưu:
library(ggplot2)
library(gridExtra)
x <- qplot(mpg, disp, data = mtcars)
y <- qplot(hp, wt, data = mtcars)
z <- qplot(qsec, wt, data = mtcars)
# A normal, plain-jane call to grid.arrange is fine for displaying all my plots
grid.arrange(x, y, z)
# But, for my purposes, I need a 2 x 2 layout. So the command below works acceptably.
grid.arrange(x, y, z, nrow = 2, ncol = 2)
# The problem is that the function I'm developing outputs a LIST of an arbitrary
# number plots, and I'd like to be able to plot every plot in the list on a 2 x 2
# laid-out page. I can at least plot a list of plots by constructing a do.call()
# expression, below. (Note: it totally even surprises me that this do.call expression
# DOES work. I'm astounded.)
plot.list <- list(x, y, z)
do.call(grid.arrange, plot.list)
# But now I need 2 x 2 pages. No problem, right? Since do.call() is taking a list of
# arguments, I'll just add my grid.layout arguments to the list. Since grid.arrange is
# supposed to pass layout arguments along to grid.layout anyway, this should work.
args.list <- c(plot.list, "nrow = 2", "ncol = 2")
# Except that the line below is going to fail, producing an "input must be grobs!"
# error
do.call(grid.arrange, args.list)
Như tôi không muốn làm, tôi khiêm tốn thu mình trong góc, háo hức chờ đợi phản hồi nghiêm túc của một cộng đồng khôn ngoan hơn tôi rất nhiều, đặc biệt nếu tôi đang làm việc này khó hơn mức cần thiết.