Je voudrais placer deux tracés côte à côte en utilisant le paquet ggplot2 , c'est-à-dire faire l'équivalent de par(mfrow=c(1,2))
.
Par exemple, j'aimerais que les deux tracés suivants s'affichent côte à côte avec la même échelle.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
Dois-je les mettre dans le même data.frame?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Christopher DuBois
la source
la source
Réponses:
Tous les ggplots côte à côte (ou n tracés sur une grille)
La fonction
grid.arrange()
dans legridExtra
package combinera plusieurs tracés; c'est ainsi que vous en mettez deux côte à côte.Cela est utile lorsque les deux tracés ne sont pas basés sur les mêmes données, par exemple si vous souhaitez tracer des variables différentes sans utiliser reshape ().
Cela tracera la sortie comme un effet secondaire. Pour imprimer l'effet secondaire à un fichier, spécifiez un pilote de périphérique ( par exemple
pdf
,png
, etc.), par exempleou, utiliser
arrangeGrob()
en combinaison avecggsave()
,C'est l'équivalent de faire deux parcelles distinctes en utilisant
par(mfrow = c(1,2))
. Cela permet non seulement de gagner du temps lors de l'organisation des données, mais également lorsque vous souhaitez créer deux tracés différents.Annexe: Utilisation des facettes
Les facettes sont utiles pour créer des tracés similaires pour différents groupes. Ceci est souligné ci-dessous dans de nombreuses réponses ci-dessous, mais je veux souligner cette approche avec des exemples équivalents aux graphiques ci-dessus.
Mettre à jour
la
plot_grid
fonction dans lecowplot
vaut la peine d'être vérifiée comme alternative àgrid.arrange
. Voir la réponse de @ claus-wilke ci-dessous et cette vignette pour une approche équivalente; mais la fonction permet des contrôles plus fins sur l'emplacement et la taille du tracé, en fonction de cette vignette .la source
?grid.arrange
me fait penser que cette fonction s'appelle maintenant arrangeGrob. J'ai pu faire ce que je voulais en faisanta <- arrangeGrob(p1, p2)
et ensuiteprint(a)
.grid.arrange
est toujours une fonction valide et non obsolète. Avez-vous essayé d'utiliser la fonction? Que se passe-t-il, sinon ce que vous attendiez.Un inconvénient des solutions basées sur le
grid.arrange
fait qu'elles rendent difficile l'étiquetage des parcelles avec des lettres (A, B, etc.), comme la plupart des revues l'exigent.J'ai écrit le package cowplot pour résoudre ce problème (et quelques autres), en particulier la fonction
plot_grid()
:L'objet qui
plot_grid()
retourne est un autre objet ggplot2, et vous pouvez l'enregistrer avecggsave()
comme d'habitude:Alternativement, vous pouvez utiliser la fonction cowplot
save_plot()
, qui est une fine enveloppe autourggsave()
qui permet d'obtenir facilement les bonnes dimensions pour les parcelles combinées, par exemple:(L'
ncol = 2
argument indiquesave_plot()
qu'il y a deux tracés côte à côte etsave_plot()
rend l'image enregistrée deux fois plus large.)Pour une description plus approfondie de la façon d'organiser les tracés dans une grille, consultez cette vignette. Il existe également une vignette expliquant comment créer des tracés avec une légende partagée.
Un point de confusion fréquent est que le package cowplot change le thème ggplot2 par défaut. Le package se comporte de cette façon car il a été initialement écrit pour des utilisations en laboratoire interne, et nous n'utilisons jamais le thème par défaut. Si cela pose problème, vous pouvez utiliser l'une des trois approches suivantes pour les contourner:
1. Définissez le thème manuellement pour chaque intrigue. Je pense que c'est une bonne pratique de toujours spécifier un thème particulier pour chaque intrigue, comme je l'ai fait avec
+ theme_bw()
dans l'exemple ci-dessus. Si vous spécifiez un thème particulier, le thème par défaut n'a pas d'importance.2. Rétablissez le thème par défaut à la valeur par défaut ggplot2. Vous pouvez le faire avec une seule ligne de code:
3. Appelez les fonctions cowplot sans attacher le paquet. Vous ne pouvez pas non plus appeler
library(cowplot)
ourequire(cowplot)
et appeler à la place des fonctions cowplot en ajoutant le préfixecowplot::
. Par exemple, l'exemple ci-dessus utilisant le thème par défaut ggplot2 deviendrait:Mises à jour:
la source
Vous pouvez utiliser la
multiplot
fonction suivante du livre de recettes R de Winston Changla source
En utilisant le package de patchwork , vous pouvez simplement utiliser l'
+
opérateur:la source
Oui, je pense que vous devez organiser vos données de manière appropriée. Une façon serait la suivante:
Je suis sûr qu'il existe de meilleures astuces dans plyr ou remodeler - je ne suis toujours pas vraiment au courant de tous ces puissants packages de Hadley.
la source
En utilisant le package de remodelage, vous pouvez faire quelque chose comme ça.
la source
Il existe également un package multipanelfigure qui mérite d'être mentionné. Voir aussi cette réponse .
Créé le 2018-07-06 par le package reprex (v0.2.0.9000).
la source
ggplot2 est basé sur des graphiques en grille, qui fournissent un système différent pour organiser les tracés sur une page. La
par(mfrow...)
commande n'a pas d'équivalent direct, car les objets de grille (appelés grobs ) ne sont pas nécessairement dessinés immédiatement, mais peuvent être stockés et manipulés en tant qu'objets R normaux avant d'être convertis en sortie graphique. Cela permet une plus grande flexibilité que le dessin de ce modèle de graphiques de base, mais la stratégie est nécessairement un peu différente.J'ai écrit
grid.arrange()
pour fournir une interface simple au plus prèspar(mfrow)
. Dans sa forme la plus simple, le code ressemblerait à:Plus d'options sont détaillées dans cette vignette .
Une plainte courante est que les tracés ne sont pas nécessairement alignés, par exemple lorsqu'ils ont des étiquettes d'axe de taille différente, mais cela est de par leur conception:
grid.arrange
n'essaie pas de cas spécial ggplot2 objets, et les traite également à d'autres grobs (tracés en treillis, par exemple ). Il place simplement les grobs dans une disposition rectangulaire.Pour le cas spécial des objets ggplot2, j'ai écrit une autre fonction,
ggarrange
avec une interface similaire, qui tente d'aligner les panneaux de tracé (y compris les tracés à facettes) et essaie de respecter les rapports d'aspect lorsqu'ils sont définis par l'utilisateur.Les deux fonctions sont compatibles avec
ggsave()
. Pour un aperçu général des différentes options et du contexte historique, cette vignette offre des informations supplémentaires .la source
Mise à jour: cette réponse est très ancienne.
gridExtra::grid.arrange()
est maintenant l'approche recommandée. Je laisse cela ici au cas où cela pourrait être utile.Stephen Turner a publié la
arrange()
fonction sur le blog Getting Genetics Done (voir le post pour les instructions d'application)la source
grid.arrange
(j'aurais aimé ne pas l'avoir publiée sur les listes de diffusion à l'époque - il n'y a aucun moyen de mettre à jour ces ressources en ligne), la version packagée est un meilleur choix si vous me le demandezEn utilisant
tidyverse
:la source
Les solutions ci-dessus peuvent ne pas être efficaces si vous souhaitez tracer plusieurs tracés ggplot à l'aide d'une boucle (par exemple, comme demandé ici: Créer plusieurs tracés dans ggplot avec différentes valeurs de l'axe Y à l'aide d'une boucle ), ce qui est une étape souhaitée dans l'analyse de l'inconnu ( ou grands) ensembles de données (par exemple, lorsque vous voulez tracer le nombre de toutes les variables dans un ensemble de données).
Le code ci-dessous montre comment faire cela en utilisant le 'multiplot ()' mentionné ci-dessus, dont la source est ici: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Maintenant, exécutez la fonction - pour obtenir les comptes pour toutes les variables imprimées à l'aide de ggplot sur une seule page
Une chose à noter est que: l'
utilisation
aes(get(strX))
, que vous utiliseriez normalement dans les boucles lorsque vous travaillez avecggplot
, dans le code ci-dessus au lieu deaes_string(strX)
ne dessinera PAS les tracés souhaités. Au lieu de cela, il tracera le dernier tracé plusieurs fois. Je n'ai pas compris pourquoi - il se peut qu'il doive le faireaes
et qu'ilaes_string
soit appeléggplot
.Sinon, j'espère que vous trouverez la fonction utile.
la source
plots
objets dansfor-loop
lesquels il est très inefficace et non recommandé dansR
. Veuillez consulter ces excellents articles pour découvrir de meilleures façons de le faire: accumulation efficace dans R , application d'une fonction sur les lignes d'un bloctidy evaluation
approche qui est disponible depuisggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542D'après mon expérience, gridExtra: grid.arrange fonctionne parfaitement si vous essayez de générer des tracés en boucle.
Extrait de code court:
la source
Le
cowplot
package vous offre un moyen agréable de le faire, d'une manière qui convient à la publication.la source