Dans le domaine de la visualisation de données avec R, le package ggplot2 se distingue par sa capacité à générer des graphiques à la fois complexes et visuellement attrayants grâce à sa grande flexibilité.
Toutefois, lorsqu’il s’agit d’analyser différents graphiques, il est souvent nécessaire de pouvoir les comparer, les contraster ou simplement les présenter côte à côte.
Dans cet article, je vous propose un tutoriel détaillé pour explorer deux approches, l’une simple et l’autre plus élaborée, afin de répondre efficacement à ce besoin d‘assembler plusieurs graphiques.
Une solution toute simple pour assembler plusieurs graphiques, consiste à employer la fonction ggarrange()
du package gridExtra
. Je l’utilise lorsqu’il s’agit uniquement de positionner plusieurs graphiques côte à côte, sans ajouter de texte, ou sans employer des tailles de graphiques différentes. C’est possible, mais dans cette situation, je préfère utiliser les packages patwork
ou cowplott
(je vous en parle plus loin).
library(ggplot2)
g1 <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, colour=Species))+
geom_point()+
geom_smooth(method="lm")+
facet_wrap(~Species)
g2 <- ggplot(iris, aes(x=Species, y=Sepal.Length, colour=Species))+
geom_jitter(height=0, width=0.15)+
geom_boxplot(outlier.alpha=0, alpha=0.5)+
coord_flip()
library(gridExtra)
grid.arrange(g1, g2)
Assembler plusieurs graphiques est très simple. Et si nous souhaitons une disposition en 2 colonnes, il suffit d’ajouter l’argument ncol=2
(ou nrow=2
pour une disposition en 2 lignes) :
grid.arrange(g1, g2, ncol=2)
Pour éviter de répéter la légende, vous pouvez la supprimer sur le 2ᵉ graphique, mais cela cré un décalage. Par exemple :
g2.2 <- g2 +
theme(legend.position = "none")
grid.arrange(g1, g2.2)
À noter que si vous souhaitez assembler plusieurs graphiques réalisés avec un package complémentaire à ggplot2
, comme GGally
, vous allez obtenir un message d’erreur :
library(GGally)
g3 <- ggpairs(iris, aes(colour=Species))
grid.arrange(g1,g3)
Error in gList(...): only 'grobs' allowed in "gList"
Cette erreur se produit parce que ggpairs()
(du package GGally
) ne retourne pas un objet dont le type peut être directement assemblé par gridExtra
.
Pour résoudre ce problème, vous devez convertir le résultat de la fonction ggpairs()
en employant la fonction ggmatrix_gtable() :
g3_grob <- GGally::ggmatrix_gtable(g3)
# Utiliser grid.arrange avec g1 et le grob de g3
grid.arrange(g1, g3_grob, ncol = 2)
Pour aller plus loin avec la fonction grid.arrange()
, vous pouvez consulter la vignette du package gridExtra
ici : https://cran.r-project.org/web/packages/gridExtra/vignettes/arrangeGrob.html
Lorsque j’ai besoin d’assembler plusieurs graphiques de manière un peu plus sophistiquée, j’emploie le package patchwork
.
Sa syntaxe est assez simple : on utilise les opérateurs
+
pour assembler , |
pour indiquer ce qui doit être sur la même ligne/
pour indiquer l’utilisation d’une nouvelle ligne.Vous allez voir c’est assez intuitif, et les possibilités sont nombreuses.
Si vous avez des difficultés à l’installer classiquement avec l’onglet “Packages” de Rstudio, vous pouvez passer par son répertoire Github :
# install.packages("devtools")
devtools::install_github("thomasp85/patchwork")
library(patchwork)
# L'opertaeur + pour assembler
g1 + g2
Si nous souhaitons 2 lignes, nous utilisons l’opérateur “/”
g1 / g2
(g1 | g2)/g3_grob
g1|(g2/g3_grob)
Il est également possible d’ajouter une annotation avec la fonction plot_annotation()
:
(g1 | g2)/g3_grob +
plot_annotation(tag_levels="A")
Le tag employé est automatiquement itéré :
(g1 | g2)/g3_grob +
plot_annotation(tag_levels="1")
Vous pouvez spécifier la taille des différents graphiques avec la fonction plot_layout()
et ses arguments height
et width
. Ici les 2 plots du haut sont 3 fois moins hauts que celui du bas :
(g1 | g2) / g3_grob +
plot_layout(height=c(1,3))
Avec patchwork
l’absence de légende sur un des 2 graphes n’entraîne pas de décalage :
g1 / g2.2
Et il est aussi possible de la déplacer, afin qu’elle soit associée à l’ensemble des plots, en utilisant la fontion plot_layout()
et son argument guides = 'collect'
:
g1 / g2.2 + plot_layout(guides = 'collect')
Parfois, deux graphes partagent les mêmes axes:
g4 <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, colour=Species))+
geom_point()+
geom_smooth(method="lm")+
theme(legend.position="none")
g5 <- ggplot(iris, aes(x=Petal.Length, y=Sepal.Width, colour=Species))+
geom_point()+
geom_smooth(method="lm")+
theme(legend.position="none")
g4 + g5
Dans cette situation, de façon un peu similaire à la légende, il est possible d’en afficher qu’un seul, en utilisant la fonction plot_layout()
et son argument axes = 'collect'
g4+g5 + plot_layout(axes = "collect")
Les possibilités d’assemblage avec patchwork sont très importantes, vous trouverez des informations et des exemples complémentaires dans la vignette du package : https://patchwork.data-imaginist.com/index.html
Si vous ne parvenez pas à faire ce que vous souhaitez avec patchwork
, vous pourrez probablement le faire avec le package cowplot
, notamment en terme d’alignement (les 2 packages utilisent des approches différentes). r
Le package a été initialement écrit par Claus O. Wilke pour un usage interne afin de fournir à des étudiants et postdoctorants les outils nécessaires pour créer des figures de haute qualité pour leurs publications. Il est également largement utilisé dans son livre Fundamentals of Data Visualization (https://clauswilke.com/dataviz/.
Vous trouverez l’ensemble des vignettes ici : https://wilkelab.org/cowplot/articles/index.html
Si vous employez le package ggpubr
pour réaliser certains graphiques, ce package propose aussi des fonctions pour les assembler, notamment les fonctions :ggarrange()
,ggexport()
,annotate_figure()
,background_image()
. Vous trouverez plus d’informations sur ces fonctions, ici: https://rpkgs.datanovia.com/ggpubr/reference/index.html
Comme nous venons de le voir, R propose plusieurs possibilités pour assembler des graphiques,et ainsi représenter des données complexes de façon harmonieuse et visuellement élégante.
Le package gridExtra
est idéal pour les besoins d’arrangement de plusieurs graphiques, de manière rapide et direct, sans fioritures. Le package patchwork
, quant à lui, permet d’assembler plusieurs graphiques de manière plus fine, en permettant une gestion facile des annotations et des légendes. Pour les besoins d’alignement précis et pour une intégration plus poussée avec ggplot2, le package cowplot
peut être une solution intéressante, en particulier pour les publications de haute qualité.
Au-delà de ces trois packages
, le package ggpubr
offre également des options intéressantes pour ceux qui utilisent déjà ses fonctions de création de graphiques.
Chacun de ces outils a sa place dans notre boîte à outils, et la maîtrise de leur utilisation peut grandement enrichir la qualité et l’impact de nos visualisations.
J’aimerais beaucoup connaître votre avis sur cet article. Que vous ayez des retours à partager, des astuces supplémentaires à proposer ou des difficultés que vous avez rencontrées en assemblant des graphiques dans R, n’hésitez pas à laisser un commentaire ci-dessous. Votre expérience peut grandement bénéficier à tous !
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page Tipeee du blog
Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.
2 Responses
Merci Claire pour ce tuto que je testerai prochainement.
J’avais déjà mis les mains dans les affichages graphiques mais sans aller plus loin et par manque de temps. J’étais donc passé par navigation en onglet FlexDashBoard.
Je suppose que c’est Flex et/ou shiny compatible ?
Merci d’avance, et belle journée !
Bonjour Claire,
Bravo pour ce tutoriel toujours aussi clair et instructuf. Et bravo pour la vignette de début de document, vous faites cela comment ?