¿Cómo puedo obtener una grilla “desbalanceada” de ggplots?

Con grid.arrange puedo organizar varias figuras ggplot en una grilla para lograr una figura de varios paneles usando algo como:

 library(ggplot2) library(grid) library(gridExtra) 

generar algunos gráficos ggplot2, luego

 plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2) 

¿Cómo puedo obtener un diseño de 2 columnas “desequilibrado” con un trazado en todo el primer círculo y tres trazados en el segundo círculo? Jugué con un enfoque de “cuadrícula de grillas” al tratar de usar grid.arrange para trazar una cuadrícula (por ejemplo, plot5 , arriba) contra otra ttwig, pero obtuve:

Error en arrangeGrob (…, as.table = as.table, clip = clip, main = main,: ¡la entrada debe ser grobs!

Actualizar:

Gracias por el consejo. Voy a mirar en los grid viewports y la grid . Mientras tanto, gracias a @DWin, la función layOut en el paquete ‘wq’ funcionó muy bien para la figura de comstackción en mi documento Sweave : enter image description here

Actualización 2:

El comando arrangeGrob (como lo sugiere @baptiste) también funciona bien, y parece muy intuitivo, al menos fue fácil alterar el ancho de las dos columnas. También tiene el beneficio de no requerir el paquete `wq ‘.

Por ejemplo, aquí está el código de mi archivo Sweave:

 < 

que produce el siguiente resultado: enter image description here

Por cierto, ¿alguien me dice por qué aparece el ‘> NA’?

    grid.arrange dibuja directamente en el dispositivo; si quieres combinarlo con otros objetos de la cuadrícula, necesitas arrangeGrob , como en

      p = rectGrob() grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1), ncol=2) 

    Editar (07/2015): con v> 2.0.0 puede usar el argumento layout_matrix ,

      grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4))) 

    Intenté resolverlo con la cuadrícula y pensé que lo tenía mal pero terminé fallando (aunque ahora miro el código en la función que cito a continuación, puedo ver que estaba muy cerca … 🙂

    El paquete ‘wq’ tiene una función layOut que lo hará por usted:

     p1 < - qplot(mpg, wt, data=mtcars) layOut(list(p1, 1:3, 1), # takes three rows and the first column list(p1, 1, 2), # next three are on separate rows list(p1, 2,2), list(p1, 3,2)) 

    enter image description here

    Otra alternativa es el paquete de patchwork de Thomas Lin Pedersen.

     # install.packages("devtools") # devtools::install_github("thomasp85/patchwork") library(patchwork) 

    Genera algunas plots.

     p1 < - ggplot(mtcars) + geom_point(aes(mpg, disp)) + facet_grid(rows = vars(gear)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) p4 <- ggplot(mtcars) + geom_bar(aes(carb)) 

    Ahora arregla las plots.

     p1 + (p2 / p3 / p4) 

    enter image description here

    También hay un paquete multipanelfigure que vale la pena mencionar. Ver también esta respuesta .

     library(ggplot2) theme_set(theme_bw()) q1 < - ggplot(mtcars) + geom_point(aes(mpg, disp)) q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) q4 <- ggplot(mtcars) + geom_bar(aes(carb)) library(magrittr) library(multipanelfigure) figure1 <- multi_panel_figure(columns = 2, rows = 3, panel_label_type = "upper-roman") figure1 %<>% fill_panel(q1, column = 1, row = 1:3) %<>% fill_panel(q2, column = 2, row = 1) %<>% fill_panel(q3, column = 2, row = 2) %<>% fill_panel(q4, column = 2, row = 3) #> `geom_smooth()` using method = 'loess' and formula 'y ~ x' figure1 

    Creado en 2018-07-16 por el paquete reprex (v0.2.0.9000).