Ini diposkan silang di grup google ggplot2
Situasi saya adalah bahwa saya sedang mengerjakan fungsi yang mengeluarkan sejumlah plot yang berubah-ubah (tergantung pada data input yang disediakan oleh pengguna). Fungsi mengembalikan daftar plot n, dan saya ingin meletakkan plot tersebut dalam formasi 2 x 2. Saya berjuang dengan masalah simultan dari:
- Bagaimana saya dapat mengizinkan fleksibilitas untuk diberikan sejumlah plot (n) yang berubah-ubah?
- Bagaimana saya juga bisa menentukan saya ingin mereka ditata 2 x 2
Strategi saya saat ini menggunakan grid.arrange
dari gridExtra
paket. Ini mungkin tidak optimal, terutama karena, dan ini adalah kuncinya, ini sama sekali tidak berfungsi . Berikut kode contoh saya yang dikomentari, bereksperimen dengan tiga plot:
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)
Seperti yang biasa saya lakukan, saya dengan rendah hati meringkuk di sudut, dengan penuh semangat menunggu umpan balik bijak dari komunitas yang jauh lebih bijaksana daripada saya. Terutama jika saya membuat ini lebih sulit dari yang seharusnya.