web-dev-qa-db-fra.com

Comment puis-je obtenir une grille «déséquilibrée» de ggplots?

Avec grid.arrange Je peux organiser plusieurs ggplot figures dans une grille pour obtenir une figure à plusieurs panneaux en utilisant quelque chose comme:

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

générer des tracés ggplot2, puis

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

Comment puis-je obtenir une disposition à 2 colonnes "déséquilibrée" avec une parcelle dans tout le premier col et trois parcelles dans le deuxième col? J'ai joué avec une approche "grille de grille" en essayant d'utiliser grid.arrange pour tracer une grille (par exemple plot5, ci-dessus) contre un autre complot, mais obtenu:

Erreur dans arrangeGrob (..., as.table = as.table, clip = clip, main = main,: l'entrée doit être grobs!

Mise à jour:

Merci pour le conseil. J'examinerai viewports et grid. En attendant, grâce à @DWin, la fonction layOut dans le paquet 'wq' a très bien fonctionné pour la figure de compilation dans mon document Sweaveenter image description here

Mise à jour 2:

La commande arrangeGrob (comme suggéré par @baptiste) fonctionne également bien, et semble très intuitive - au moins, il était facile de modifier la largeur des deux colonnes. Il a également l'avantage de ne pas nécessiter le package `wq '.

par exemple. Voici le code de mon fichier 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}

qui produit la sortie suivante: enter image description here

BTW, quelqu'un me dit pourquoi le '> NA' apparaît?

93
user441706

grid.arrange s'appuie directement sur l'appareil; si vous souhaitez le combiner avec d'autres objets de la grille, vous avez besoin de arrangeGrob, comme dans

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

Edit (07/2015): avec v> 2.0.0, vous pouvez utiliser le layout_matrix argument,

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

J'ai essayé de le comprendre avec la grille et j'ai pensé que je l'avais, mais j'ai échoué (bien qu'en regardant maintenant le code dans la fonction que je cite ci-dessous, je peux voir que j'étais vraiment proche ... :-)

Le paquet 'wq' a une fonction layOut qui le fera pour vous:

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

17
42-

Une autre alternative est le paquet patchwork de Thomas Lin Pedersen.

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

Générez des tracés.

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

Arrangez maintenant les parcelles.

p1 + (p2 / p3 / p4)

enter image description here

2
markus

Il y a aussi package multipanelfigure qui mérite d'être mentionné. Voir aussi ceci réponse .

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

Créé le 2018-07-16 par le package reprex (v0.2.0.9000).

1
Tung