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?

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


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

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


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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.