Come posso organizzare un numero arbitrario di ggplot usando grid.arrange?



Answers

Prova questo,

require(ggplot2)
require(gridExtra)
plots <- lapply(1:11, function(.x) qplot(1:10,rnorm(10), main=paste("plot",.x)))

params <- list(nrow=2, ncol=2)

n <- with(params, nrow*ncol)
## add one page if division is not complete
pages <- length(plots) %/% n + as.logical(length(plots) %% n)

groups <- split(seq_along(plots), 
  gl(pages, n, length(plots)))

pl <-
  lapply(names(groups), function(g)
         {
           do.call(arrangeGrob, c(plots[groups[[g]]], params, 
                                  list(main=paste("page", g, "of", pages))))
         })

class(pl) <- c("arrangelist", "ggplot", class(pl))
print.arrangelist = function(x, ...) lapply(x, function(.x) {
  if(dev.interactive()) dev.new() else grid.newpage()
   grid.draw(.x)
   }, ...)

## interactive use; open new devices
pl

## non-interactive use, multipage pdf
ggsave("multipage.pdf", pl)
Question

Questo è cross-postato sul gruppo google ggplot2

La mia situazione è che sto lavorando su una funzione che genera un numero arbitrario di grafici (a seconda dei dati di input forniti dall'utente). La funzione restituisce una lista di n grafici, e mi piacerebbe gettare quei diagrammi nella formazione 2 x 2. Sono alle prese con i problemi simultanei di:

  1. Come posso permettere che la flessibilità sia consegnata a un numero arbitrario (n) di lotti?
  2. Come posso anche specificare che li voglio disposti 2 x 2

La mia strategia attuale utilizza grid.arrange dal pacchetto gridExtra . Probabilmente non è ottimale, soprattutto da quando, e questa è la chiave, non funziona affatto . Ecco il mio codice di esempio commentato, sperimentando tre trame:

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)

Come sono solito fare, mi rannicco umilmente in un angolo, aspettando con impazienza il feedback sagace di una comunità molto più saggia di me. Soprattutto se lo sto rendendo più difficile di quanto dovrebbe essere.






Links