Comment organiser une liste variable de tracés à l'aide de grid.arrange?

92
library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above.

Je voudrais organiser les parcelles en utilisant grid.arrange()in gridExtra.

Comment procéder si le nombre de parcelles plistest variable?

Cela marche: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

mais j'ai besoin d'une solution plus générale. pensées?

Maiasaura
la source

Réponses:

139

Que dis-tu de ça:

library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))

entrez la description de l'image ici

Josh O'Brien
la source
C'est bien, sauf que la fonction ne peut pas gérer les objets NULL.
Roman Luštrik
Josh. Je t'aime. J'ai passé 2 heures là-dessus jusqu'à présent. Voudriez-vous expliquer pourquoi cela ne fonctionne pas: grid.arrange(plist[[1:length(plist)]], ncol = nCol))j'obtiens une erreur comme celle-ci: Error in hl.plots[[1:12]] : no such index at level 3Merci!
Anto le
2
@Anto Il semble y avoir plusieurs choses de mal à ce code, mais celui que vous donnant l'erreur affichée est probablement causée par le même type d'erreur est indiqué ici: x <- list(1,2); x[[3:1]]. Plus largement, utilisez quelque chose comme plist[...]plutôt que plist[[...]]de faire votre sous-ensemble. Et puis utilisez do.call(), que nous devons utiliser car grid.arrange()n'est pas configuré pour prendre une liste comme premier argument. Salutations et bonne chance!
Josh O'Brien
31

Vous pouvez utiliser grid.arrange()et arrangeGrob()avec des listes aussi longtemps que vous spécifiez la liste en utilisant l' grobs =argument de chaque fonction. Par exemple, dans l'exemple que vous avez donné:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot
Michael Ohlrogge
la source
1
Cela m'a pris trop de temps pour trouver cette réponse ... merci! C'est le plus simple.
Matt L.
16

Par souci d'exhaustivité (et comme cette ancienne question déjà répondue a été relancée, récemment ), je voudrais ajouter une solution en utilisant le cowplotpackage:

cowplot::plot_grid(plotlist = plist, ncol = 2)

entrez la description de l'image ici

Uwe
la source
toute idée de la raison pour laquelle passer une liste de parcelles à l'aide de ce code renvoie cette erreur: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie
Comment les graphiques ont-ils été générés? Vous utilisez le ggplot2package ou les graphiques de base?
Uwe
ggplot2. grid.arrangea presque fonctionné pour moi - mais, il s'avère que ma liste de parcelles ne se remplit pas. J'ai posté le problème sous forme de question: stackoverflow.com/questions/43216262/… . Donc, je me demande si cela aurait pu également être le problème pour cowplot
geog_newbie
10

Je sais que la question indique spécifiquement l'utilisation du package gridExtra , mais la wrap_plotsfonction du package patchwork est un excellent moyen de gérer la liste de longueur variable:

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

wrap_plots(plist)

entrez la description de l'image ici

Une chose utile à ce sujet est que vous n'avez pas besoin de spécifier le nombre de colonnes requises et que vous viserez à maintenir les nombres de colonnes et de lignes égaux. Par exemple:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

En savoir plus sur le package patchwork ici

Michael Harper
la source
Je n'arrive pas à installer le package que vous avez mentionné ici
baxx
Avez-vous essayé d'exécuter la ligne d'installation commentée ci devtools::install_github("thomasp85/patchwork")- dessus ?
Michael Harper
Merci, je ne l'ai pas fait. J'ai juste essayé d'utiliser l'installation de RStudio.
baxx
1
Le package n'est pas encore disponible sur CRAN, vous devez donc l'installer via GitHub. Espérons que ce ne sera pas le cas plus longtemps car c'est un excellent package!
Michael Harper
1

Pour adapter tous les tracés sur une seule page, vous pouvez calculer le nombre de colonnes et de lignes comme ceci:

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

Comme la plupart des fonctions de traçage multiples ont ncol et nrow comme arguments, vous pouvez simplement les insérer ici. J'aime ggarrange de ggpubr.

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

Cela favorise plus de lignes que de colonnes, donc inversez si vous voulez le contraire. C'est-à-dire que pour 6 parcelles, cela donnera 3 lignes et 2 colonnes et non l'inverse.

Adam Waring
la source