Come posso ottenere una griglia di ggplots "sbilanciata"?


94

Con grid.arrangeposso disporre più ggplotfigure in una griglia per ottenere una figura multi-pannello usando qualcosa come:

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

generare alcuni grafici ggplot2, quindi

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

Come posso ottenere un layout a 2 colonne "sbilanciato" con un grafico nell'intera prima colonna e tre grafici nella seconda colonna? Ho giocato con un approccio 'griglia di griglie' cercando di utilizzare grid.arrangeper tracciare una griglia (ad esempio plot5, sopra) contro un'altra trama, ma ho ottenuto:

Errore in organizzareGrob (..., as.table = as.table, clip = clip, main = main,: l'input deve essere grobs!

Aggiornare:

Grazie per il consiglio. Esaminerò viewportse grid. Nel frattempo, grazie a @DWin, la layOutfunzione nel pacchetto 'wq' ha funzionato molto bene per la figura di compilazione nel mio Sweavedocumento: inserisci qui la descrizione dell'immagine

Aggiornamento 2:

Anche il arrangeGrobcomando (come suggerito da @baptiste) funziona bene e sembra molto intuitivo - almeno è stato facile modificare le larghezze delle due colonne. Ha anche il vantaggio di non richiedere il pacchetto `wq '.

ad esempio, ecco il codice dal mio file Sweave:

<<label=fig5plot, echo=F, results=hide>>=
plot5<-grid.arrange(plot4, arrangeGrob(plot1, plot2, plot3, ncol=1), 
                    ncol=2, widths=c(1,1.2))
@
\begin{figure}[]
    \begin{center}
<<label=fig5,fig=TRUE,echo=T, width=10,height=12>>=
<<fig5plot>>
@
\end{center}
\caption{Combined plots using the `arrangeGrob' command.}
\label{fig:five}
\end{figure}

che produce il seguente output: inserisci qui la descrizione dell'immagine

A proposito, qualcuno mi dice perché appare "> NA"?


Potrebbe essere necessario impostare tu stesso le visualizzazioni - grid.arrangepotrebbe non essere abbastanza flessibile (cerca stackoverflow per "[r] visualizzazione griglia")
Ben Bolker

2
@ BenBolker ti ha indicato una direzione fruttuosa usando grid. Vedere anche il libro ggplot2 di Hadley, Sezione 8.4.2.
Ari B. Friedman

1
@BenBolker grid.arrangepuò essere utilizzato con le finestre nidificate usando il suo compagno arrangeGrob(essenzialmente restituendo a gTree), come nell'esempio che ho fornito di seguito.
baptiste

1
l'assegnazione finale a plot5non è richiesta poiché grid.arrangenon restituisce nulla (NULL). Se vuoi salvare il grob risultante, usalo di arrangeGrobnuovo (e grid.drawper visualizzarlo).
baptiste

Risposte:


73

grid.arrangedisegna direttamente sul dispositivo; se vuoi combinarlo con altri oggetti della griglia di cui hai bisogno arrangeGrob, come in

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

Modifica (07/2015): con v> 2.0.0 puoi usare l' layout_matrixargomento,

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

6
Puoi spiegare come la cbind(c(1,1,1), c(2,3,4))matrice descrive la disposizione delle figure?
Ron Gejman,

5
@RonGejman è facile se stampi la matrice 3x2 sullo schermo: la prima colonna è tutta 1, è lì che risiede la prima trama, che copre le tre righe; la seconda colonna contiene i grafici 2, 3, 4, ognuno dei quali occupa una riga.
baptiste

17

Ho provato a capirlo con la griglia e ho pensato di averlo abbassato ma ho finito per fallire (anche se guardando ora il codice nella funzione che cito di seguito, posso vedere che ero molto vicino ... :-)

Il pacchetto 'wq' ha una layOutfunzione che lo farà per te:

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))

inserisci qui la descrizione dell'immagine


Wow, questa è una funzione utile! Penso che copia + incolla possa aver fallito, però; volevi dire per g1, g2, ecc per essere tutti p1?
joran

3
@jorano: l'ho fatto. Non ricordo quale delle "tre virtù della programmazione" sia la Pigrizia, ma so che è lì da qualche parte.
IRTFM

Grazie! Ha funzionato molto bene. Vedi sopra.
user441706

2

Un'altra alternativa è il patchworkpacchetto di Thomas Lin Pedersen.

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

Genera alcuni grafici.

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))

Ora organizza le trame.

p1 + (p2 / p3 / p4)

inserisci qui la descrizione dell'immagine


1

C'è anche un pacchetto multipanelfigure che vale la pena menzionare. Vedi anche questa risposta .

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

Creato il 16/07/2018 dal pacchetto reprex (v0.2.0.9000).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.