Crear paneles arbitrarios en ggplot2

En gráficos base, puedo crear un panel de gráficos de 4 paneles haciendo lo siguiente:

par(mfrow=c(2,2)) for (i in 1:4){ plot(density(rnorm(100))) } 

lo que resulta en

enter image description here

Me gustaría hacer el mismo tipo de cosas con ggplot2, pero no puedo entender cómo hacerlo. No puedo usar facetas porque mis datos reales, a diferencia de este ejemplo trivial, se encuentran en estructuras muy diferentes y quiero que dos gráficos sean gráficos de puntos y dos sean histogtwigs. ¿Cómo se pueden crear paneles o paneles en ggplot2?

Siguiendo el ejemplo de Josh O’Brien: estoy sorprendido de que nadie haya mencionado grid.arrange desde el paquete gridExtra aún:

 library(gridExtra) grid.arrange(q1,q2,q3,q4,q5,q6,nrow=3) 

Esto parece ser mencionado aquí: múltiples gráficos en un canvas usando ggplot2

Para mí, es mucho más fácil que recordar todo el material de la vista.

EDITAR: {Ben Bolker apunta a una opción aún mejor: grid.arrange del paquete gridExtra . Sin embargo, si usted es un usuario de ggplot2 , todavía merece la pena hacer clic en el sitio de R Cookbook . }

Hay código para una buena función de multiplot en esta página del R Cookbook (definitivamente vale la pena una visita) que es útil para este tipo de cosas. Citando directamente de ese sitio:

 multiplot <- function(..., plotlist=NULL, cols) { require(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # Make the panel plotCols = cols # Number of columns of plots plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) # Make each plot, in the correct location for (i in 1:numPlots) { curRow = ceiling(i/plotCols) curCol = (i-1) %% plotCols + 1 print(plots[[i]], vp = vplayout(curRow, curCol )) } } 

¡Probándolo con 6 ttwigs en un diseño de 3 por 2 (cuatro de las ttwigs de JD Long, y dos de bonificación!):

 set.seed(2) q1 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q5 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q6 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() multiplot(q1, q2, q3, q4, q5, q6, cols=2) 

da esta figura:

enter image description here

Si la función no se ajusta a sus necesidades, ¡al menos le brinda un buen punto de partida!

Gracias a los comentarios de Andrie y a la respuesta de Harlan a mi pregunta anterior (!), Impulsé esta solución que logra lo que buscaba:

 set.seed(2) q1 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() grid.newpage() pushViewport(viewport(layout=grid.layout(2,2))) vplayout <- function(x,y) viewport(layout.pos.row=x,layout.pos.col=y) print(q1,vp=vplayout(1,1)) print(q2,vp=vplayout(1,2)) print(q3,vp=vplayout(2,1)) print(q4,vp=vplayout(2,2)) 

cuyos rendimientos:

enter image description here

Una utilidad que creo que merece más atención es wq::layOut (tenga en cuenta la mayúscula “O”). Es como el base::layout porque las plots pueden ser de diferentes tamaños, dispuestas en filas y columnas. Cada argumento de layOut es una lista de 3 elementos que consta de la gráfica, los índices de fila en los que se layOut y los índices de columna en los que se representará. Por ejemplo:

 library("ggplot2") # Generate arbitrary ggplots plot1 <- qplot(data = mtcars, x=wt, y=mpg, geom="point",main="Scatterplot of wt vs. mpg") plot2 <- qplot(data = mtcars, x=wt, y=disp, geom="point",main="Scatterplot of wt vs disp") plot3 <- qplot(wt,data=mtcars) plot4 <- qplot(wt,mpg,data=mtcars,geom="boxplot") plot5 <- qplot(wt,data=mtcars) plot6 <- qplot(mpg,data=mtcars) plot7 <- qplot(disp,data=mtcars) wq::layOut(list(plot1, 1, 1), list(plot2, 1, 2), list(plot3, 2, 1), list(plot4, 2, 2), list(plot5, 3, 1:2), list(plot6, 4, 1:2), list(plot7, 1:2, 3)) 

enter image description here