Introduction

Les graphiques sont les outils les plus utilisés pour résumer une information chiffrée. Ils résument parfaitement les données et facilitent leurs interprétations. Le package ggplot2 , créé par Hadley Wickham, offre un outil graphique puissant pour créer des tracés élégants et complexes. Basé sur la grammaire graphique, ggplot2 permet de créer des graphiques qui représentent des données numériques et catégorielles à la fois univariées et multivariées de manière simple. Le regroupement peut être représenté par la couleur, le symbole, la taille et la transparence.

Le package patchwork et la fonction ggMarginal() du package ggExtra sont des extensions du package ggplot2 permettant de facilement combiner des graphiques ggplot dans une même fenêtre graphique.

Dans ce document, nous présenterons le fonctionnement de patchwork et ggMarginal.

1. Chargement package et description des données

En plus des packages patchwork et fonction ggMarginal de ggExtra, nous aurons besoin de datasets pour charger les données et de ggplot2 pour la création des graphiques.

Activation des packages :

library(ggplot2)
library(patchwork)
library(ggExtra)
library(datasets)

Afin de bien illustrer par des exemples les fonctionnements de patchwork et ggmargin, nous allons utiliser les données quakes et ToothGrowth du package datasets.

  • quakes: Le jeu de données fournit les emplacements de 1000 événements sismiques qui se sont produits dans une zone proche des Fidji depuis 1964. Il s’agit d’un data-frame de 1000 observations et 5 variables (magnitude, latitude, longitude, profondeur et stations). Nous avons ajouté au jeu de données la variable région comprenant les modalités “Ouest” et “Est”. Nous avons aussi arrondit la variable magnitude à l’entier.
quakes$magFactor <- factor(floor(quakes$mag))
quakes$region <- factor(quakes$long >= 175, labels = c("Ouest", "Est"))
str(quakes)
## 'data.frame':    1000 obs. of  7 variables:
##  $ lat      : num  -20.4 -20.6 -26 -18 -20.4 ...
##  $ long     : num  182 181 184 182 182 ...
##  $ depth    : int  562 650 42 626 649 195 82 194 211 622 ...
##  $ mag      : num  4.8 4.2 5.4 4.1 4 4 4.8 4.4 4.7 4.3 ...
##  $ stations : int  41 15 43 19 11 12 43 15 35 19 ...
##  $ magFactor: Factor w/ 3 levels "4","5","6": 1 1 2 1 1 1 1 1 1 1 ...
##  $ region   : Factor w/ 2 levels "Ouest","Est": 2 2 2 2 2 2 1 2 2 2 ...
  • ToothGrowth: Les données contiennent 60 observations de 3 variables. A partir de str() nous obtenons le type de variables: len (numérique): Longueur de dent; supp (facteur): Type de supplément (VC ou OJ) et dose (numérique ): Dose en milligrammes. Nous avons transformé la variable dose en facteur afin de bien construire nos graphiques.
str(ToothGrowth)
## 'data.frame':    60 obs. of  3 variables:
##  $ len : num  4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
##  $ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
##  $ dose: num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
ToothGrowth$dose <- as.factor(ToothGrowth$dose)

2. Package patchwork

Dans un premier temps, nous allons présenter le package patchwork. Comme énoncé dans l’introduction, le Package patchwork permet une présentation panoramique des graphiques de ggplot.

Description des fonctions de patchwork

Pour avoir plus de details sur une des fonctions patchwork citees dans le tableau ci-dessous, il suffit de cliquer sur le nom de la fonction. Afin de repondre a nos objectifs principaux, nous utiliserons uniquement quelques unes de ces fonctions (les plus importantes pour un objet patch) qui seront decrites lors de leur utilisation.

Nom de la fonction Description de la fonction
patchGrob() Description du contenu d’un objet patchwork
plot_arithmetic() Fournit les operateurs qui ont permis l’assemblage du patch (+, -, /, *, & …)
wrap_plots() Assemblage plus fonctionnel que les operateurs arithmetiques +, -, /. Elle permet d’empiler et d’emballer des objets patch.
guide_area() Elle permet d’ajouter une zone pour contenir les guides collectees
patchworkGrob() Elle permet de convertir un patchwork en gtable
plot_spacer() Elle permet d’ajouter une zone completement vide
wrap_elements() Elle permet d’envelopper des graphiques arbitraires dans un patch (possibilite d’ajouter des objets non-ggplot)
wrap_ggplot_grob() Conversion d’un gtable (objet cree avec ggplot2::ggplotGrob()) pour l’utiliser dans un patchwork. Elle fournit un objet utilisable dans un patch.
area() Specification d’une zone de tracage.
plot_layout() Definission de la disposition des plots dans un patch.
multipage_align() Elle permet d’aligner des plots sur plusieurs pages.
plot_annotation() Elle permet d’annoter le patchwork final.

2.1 Création des graphiques

Nous avons créé différents types de graphiques avec le package ggplot2.

Grap1 <- ggplot(quakes, aes(mag, fill = region)) + geom_histogram(mapping = aes(y = stat(density)), binwidth = 0.1, color = "white")
my3cols <- c("#E7B800", "#2E9FDF", "#FC4E07") # Couleurs

Grap11 <- ggplot(ToothGrowth, aes(x = dose, y = len)) +
  geom_boxplot(aes(color = dose)) +
  scale_color_manual(values = my3cols)
Grap2 <- ggplot(data = quakes) +
  geom_bar(mapping = aes(x = 1, fill = region)) +
  coord_polar(theta = "y") +                     # coordonnées polaires
  theme_void() +                                 # thème vide
  labs(fill = "classe de\nmagnitude")
Grap22 <- ggplot(ToothGrowth, aes(x = dose, y = len)) +
  geom_dotplot(aes(color = dose, fill = dose), binaxis='y', stackdir='center') +
  scale_color_manual(values = my3cols) + 
  scale_fill_manual(values = my3cols)
Grap3 <- ggplot(data = quakes) + 
  geom_density(mapping = aes(x = mag, fill = region), alpha = 0.5) +
  labs(x = "magnitude du séisme") +
  labs(y = "densité") +
  labs(fill = "région")
Grap33 <- ggplot(economics, aes(x = date, y = psavert)) + 
  geom_line(color = "#E46726")
Grap4 <- ggplot(data = quakes) + 
  geom_violin(mapping = aes(x = region, y = mag)) +
  labs(x = "région") +
  labs(y = "magnitude du séisme")
Grap44 <- ggplot(iris, aes(Sepal.Length)) +
  geom_density(aes(color = Species)) +
  scale_color_manual(values = my3cols)
Grap5 <- ggplot(quakes, aes(x = magFactor, y = long, color = region, shape = region)) +
  geom_jitter(position = position_jitter(0.2))

2.2 Combinaison de graphique

Pour combiner plusieurs graphiques avec patchwork, il suffit simplement de les additionner comme suit:

Faisons la combinaisons des Graphes: Grap1, Grap11, Grap3 et Grap33

Grap1 + Grap11 + Grap3 + Grap33

2.3 Disposition des graphiques

Description de la fonction plot_layout()

Arguments Valeurs possibles Description
ncol nombre entier Nombre de colonnes. Agencement vertical
nrow nombre entier Nombre de lignes. Agencement horizontal
byrow TRUE, FALSE Ordre de remplissage des plots. Si FALSE, remplissage par colonnes
widths nombre reel Largeurs de chaque colonne et ligne de la grille
heights nombre reel Longuers (ou Hauteurs) de chaque colonne et ligne de la grille
guides collect, keep, auto Traitements des guides dans la mise en pages
tag_level keep, new Comportement du marquage automatique
design Chaines de caracteres Specification de l’emplacement des zones dans la mise en page

2.3.1 Agencement vertical et horizontal

En faisant appel à la fonction plot_layout() à l’assemblage, nous pouvons modifier les dispositions des graphiques.

Pour obtenir un agencement vertical de 3 graphiques, il suffit de fixer ncol = 1 comme suit:

Grap1 + Grap11 + Grap4 + plot_layout(ncol = 1)

Pour obtenir un agencement horizontal de 3 graphiques, on fixe nrow à 1.

Grap1 + Grap11 + Grap4 + plot_layout(nrow = 1)

2.3.2 Dispositions imbriquées

Grap1 + Grap22 +
  { Grap11 + { Grap2 + Grap4 + plot_layout(ncol = 1) }
} + Grap5 + plot_layout(nrow = 2)

2.3.3 Disposition au même niveau

Nous allons mettre les graphiques Grap4 + Grap2 + Grap44 et Grap1 au même niveau suivant la colonne et la ligne.

Meme colonne

Grap4 + Grap2 + Grap44 - Grap1 + plot_layout(ncol = 1) 

Meme ligne

Grap4 + Grap2 + Grap44 - Grap1 + plot_layout(nrow = 1)

2.3.4 Autres dispositions possibles

Nous pouvons également mettre les graphiques les uns à côté des autres. patchwork nous fournit respectivement “|” et “/” pour les agencements horizontaux et verticaux

  • Exemple 1: les uns sur les autres : Grap4, Grap2 et Grap44 sur Grap1
(Grap4 | Grap2 | Grap44)/Grap1

  • Exemple 2: Les uns sous les autres: Grap4, Grap2 et Grap44 sous Grap1
Grap1/(Grap4 | Grap2 | Grap44)

  • Exemple 3: Les uns à droite des autres: Grap4, Grap2 et Grap44 à droite de Grap1
Grap1|(Grap4 / Grap2 / Grap44)

  • Exemple 4: Les uns à gauche des autres: Grap4, Grap2 et Grap44 à gauche de Grap1
(Grap4 / Grap2 / Grap44)|Grap1

2.4 Mise en forme

2.4.1 Ajout d’espace entre les graphiques

Grap2 + plot_spacer() + Grap3

2.4.2 Précision des dimensions de chaque graphique

Nous pouvons modifier les dimensions des graphiques en ajoutant plot_layout les arguments heights (pour la hauteur) et width (la largeur).

Grap1 + Grap1 + plot_layout(heights = c(1, 3)) # Modification de la hauteur

Grap1 + Grap1 + plot_layout(width = c(3, 1)) # Modification de la largeur

Grap1 + Grap33 + Grap4 + Grap22 + Grap5 + Grap44 + plot_layout(heights = c(1, 3))

2.4.3 Modification du thème des graphiques

Seuls les thèmes des graphiques Grap1 et Grap5 sont modifiés avec l’opérateur *

(Grap1 + (Grap22 + Grap33) + Grap5 + plot_layout(ncol = 1)) * theme_gray()

Les thème de tous les graphiques sont modifiés avec l’opérateur &

(Grap1 + (Grap22 + Grap33) + Grap5 + plot_layout(ncol = 1)) & theme_gray()

2.4.4 Ajout d’annotation et de style

Description de la fonction plot_annotation()

Arguments Valeurs possibles Description
title, subtitle, caption Chaines de caracteres Titre, Sous-titre et legende
tag_levels A (pour les lettres majuscules), a(pour les lettres mminuscules), i(pour les chiffres romains mminuscules), I(pour les chiffres romains majuscules), 1(Pour les chiffres) Vecteur definissant le format d’enumeration
tag_prefix, tag_suffix Chaines de caracteres Texte avant et apres la balise
tag_sep caractere Separateur entre differents niveaux de balises
theme theme Specification du theme du plot
assemblage <- Grap1 + Grap11 + Grap3 + Grap33

2.4.5 Ajout de texte

patchwork nous fournit la fonction “plot_annotation()” afin d’ajouter du texte descriptif à notre assemblage graphique

- Titres

assemblage + plot_annotation(title = "Combinaison des graphiques")

### - Sous-titres

assemblage + plot_annotation(title = "Combinaison des graphiques",
                subtitle = "Mon sous-titre")

- Légendes

assemblage + plot_annotation(title = "Combinaison des graphiques",
                subtitle = "Mon sous-titre",
                caption = "Ma légende")

- Marquage

patchwork fournit également une fonctionnalité de marquage automatique qui s’active en augmentant l’argument “tag_level” dans “plot_annotation()”

Utilisation: ‘1’ pour les chiffres arabes, ‘A’ pour en majuscules lettres latines, ‘a’ pour les lettres latines minuscules, ‘I’ pour les chiffres romains en majuscules et ’i’pour les chiffres romains en minuscules.

assemblage + plot_annotation(title = "Combinaison des graphiques",
                             subtitle = "Mon sous-titre",
                             caption = "Légende: Ma légende ici",
                             tag_levels = 'A')

2.5 Enregistrement d’un “patchwork”

GF <- assemblage +
  plot_annotation(title = "Combinaison des graphiques",
                                   subtitle = "Mon sous-titre",
                                   caption = "Légende: Ma légende ici",
                                   tag_levels = 'A')
Format PDF
save_plot("Graphique_Final.pdf", GF, ncol = 2, nrow = 2, base_aspect_ratio = 1.3)
Format PNG
save_plot("Graphique_Final.png", GF, ncol = 2, nrow = 2, base_aspect_ratio = 1.3)
Format JPEG
save_plot("Graphique_Final.jpeg", GF, ncol = 2, nrow = 2, base_aspect_ratio = 1.3)

3. Fonction ggMarginal du package ggExtra

La fonction ggMarginal du package ggExtra peut être utilisée pour ajouter facilement un histogramme marginal, une densité ou un boxplot à un nuage de points.

Description de la fonction ggMarginal

Arguments Valeurs possibles Description
p Objet ggplot2 Diagramme auquel on veut ajouter des plots marginaux. Si p n’est pas fourni alors data, x et y doivent etre fournis obligatoirement
data data.frame Donnees utilisees. Facultatif si p est fourni
x Texte Nom de la variable suivant l’axe x. Facultatif si p est fourni
y Texte Nom de la variable suivant l’axe y. Facultatif si p est fourni
type plot (density, histogram, boxplot, …) Type de plot marginal
margins x ou y La marge a utiliser
size entier Taille des parcelles marginales par rapport a la parcelle principale
xparams Liste des parametres supplementaires uniquement pour le plot marginal suivant l’axe x
yparams Liste des parametres supplementaires uniquement pour le plot marginal suivant l’axe y
groupColour TRUE, FALSE couleur (ou le contour) des diagrammes marginaux
groupFill TRUE, FALSE remplissage des diagrammes marginaux

D’autres parametres peuvent etre utilises pour les parcelles marginales. La liste n’est pas exhaustive.

3.1 Création des tracées de base

Tout d’abord, créons les tracées de base :

p = ggplot(quakes, aes(x = mag, y = stations, color=stations, size = stations)) + geom_point() +
  theme(legend.position="none")

3.2 Histogramme marginal

Pour obtenir un histogramme marginal, on fixe type = ‘histogram’

mHa = `ggMarginal`(p, type = 'histogram')
mHa

Il est possible d’ajouter des couleurs à notre histogramme marginal.

mHc = `ggMarginal`(p, type="histogram", fill = "slateblue", xparams = list(  bins=10))
mHc

3.3 Densité marginale

Pour obtenir une densité marginale, on fixe type = ‘density’

mDa = `ggMarginal`(p, type = 'density')
mDa 

Ajoutons une couleurs pour mieux mettre en éxergue notre tracée.

mDc = `ggMarginal`(p, type="density", fill = "slateblue", xparams = list(  bins=10))
mDc 

3.4 Boxplot marginal

Pour obtenir un boxplot marginal, on fixe type = ‘boxplot’

mBa = `ggMarginal`(p, type = 'boxplot')
mBa

L’option d’ajout de couleurs reste disponiple pour les boxplots marginaux.

mBc = `ggMarginal`(p, type="boxplot", fill = "slateblue", xparams = list(  bins=10))
mBc

3.5 Option avancée

Si notre nuage de points a une variable de facteur mappée à une couleur (c’est-à-dire que les points dans le nuage de points sont codés par couleur en fonction d’une variable dans les données, en utilisant aes(colour = …)), nous pouvons utiliser groupColour = TRUE et/ou groupFill = TRUE pour refléter ces regroupements dans les graphiques marginaux. Il en résulte plusieurs tracés marginaux, un pour chaque groupe de points de couleur.

p <- ggplot(quakes, aes(x = mag, y = stations , colour = region)) +
  geom_point(aes(fill = region))

ggMarginal_Final = ggMarginal(p, groupFill = TRUE, groupColour = TRUE)
ggMarginal_Final 

3.6 Enregistrement graphiques

#format PDF
Save_plot("ggMarginal_Final.pdf", ggMarginal_Final, ncol = 2,nrow = 2, base_aspect_ratio = 1.3)
#format PNG
save_plot("ggMarginal_Final.png", ggMarginal_Final, ncol = 2,nrow = 2, base_aspect_ratio = 1.3)
#format JPEG
save_plot("ggMarginal_Final.jpeg", ggMarginal_Final, ncol = 2,nrow = 2, base_aspect_ratio = 1.3)

Conclusion

  • La combinaison de plusieurs ggplots dans un même graphique est facilement effectuée avec le package patchwork. Le package offre des options multiples et utilisables facilement. Un des points forts du package est la possibilité de combiner en même temps des objets de types différents avec les fonctions wrap_elements() et wrap_ggplot_grob() ce qui n’est pas le cas avec le package cowplot, par exemple. Comme point faible, nous pouvons citer le fait que patchwork ne prenne que des objets de types ggplots. Il faut convertir tout autre objet afin de l’utliser.

  • La fonction ggMarginal du package ggExtra permet de résoudre le problème courant de tracès des graphiques marginaux. Pour se faire, l’utilisateur fournir soit un nuage de points issu de ggplot2, soit l’ensemble de données et les variables.Un problème récurent noté est l’apparition d’un espace blanc entre le nuage de points et les graphiques marginaux. Ce problème résulte du fait que le diagramme marginal n’a pas nécessairement les mêmes axes que le diagramme de dispersion. Cependant, ce problème peut être résolu avec ggplot_build(), une fonction pratique qui peut être utilisée pour récupérer des informations à partir d’un tracé. Plus précisément, ggplot_build permet de regarder les éléments d’un objet graphique et d’identifier la plage de l’axe, la taille du texte, etc.