# Installer et charger le package {ggplot2}
install.packages("ggplot2")
library(ggplot2)
# Installer et charger la suite {tidyverse}
install.packages("tidyverse")
library(tidyverse)
Introduction
La grammaire des graphiques
Le package {ggplot2}
(qui fait partie du Tidyverse) repose sur le principe de la grammaire des graphiques : un graphique se construit couche par couche.
Pré-requis
Si vous n’avez pas suivi les autres tutoriels, vous pouvez créer un projet RStudio et une arborescence.
Commencez par installer le package {ggplot2}
. Vous pouvez également installer et charger le {tidyverse}
(préférez cette solution si vous comptez manipuler les données avant de créer les graphiques).
Le jeu de données
Nous allons utiliser le jeu de données tiré du package {Palmer penguins}
.
Pour importer ce jeu de données, utilisez la commande suivante :
<- readr::read_csv("https://raw.githubusercontent.com/codons-blog/ateliers_codons/main/data/pingouins_propre.csv") pingouins
Explorons rapidement ces données :
::glimpse(pingouins) dplyr
Graphiques simples
Nuage de points
Un {ggplot2}
nécessite au minimum les trois éléments suivants :
les données utilisées (data)
l’apparence esthétique des éléments du graphique, comme la position, la couleur, la taille, la forme, et la transparence (aesthetics)
les formes utilisées pour représenter les données (geometries)
Ces trois éléments suffisent pour créer un graphique simple. Il existe beaucoup d’autres éléments permettant la personnalisation du graphique.
Créons un nuage de points représentant la longueur du bec en fonction de la longueur des ailes.
ggplot(data = pingouins)
Cette commande permet d’initialiser notre graphique. Seul l’arrière-plan gris est visible pour le moment.
Ajoutons les deux variables que nous souhaitons représenter :
ggplot(data = pingouins,
mapping = aes(x = longueur_aile_mm, y = longueur_bec_mm))
Les deux variables ont été ajoutées, et les échelles des deux axes ont été automatiquement calculées.
L’argument mapping =
n’est pas indispensable, le code suivant fonctionnera de la même façon :
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm))
Pour finir, nous allons préciser que nous souhaitons représenter la relation entre ces deux variables à l’aide d’un nuage de points :
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point()
Un graphique {ggplot2}
peut être stocké dans un objet. Cela permet de définir le graphique basique puis d’y apporter des modifications.
<- ggplot(data = pingouins,
g aes(x = longueur_aile_mm, y = longueur_bec_mm))
+
Lorsque vous créez un graphique avec {ggplot2}
, l’ajout d’une nouvelle couche s’effectue à l’aide d’un +
à la fin de la ligne.
Ajouter des couleurs
Le nuage de points ci-dessus représente la relation entre deux variables, mais ne nous donne aucune indication sur l’identité de chaque point. Nous aimerions colorer chaque point en fonction de l’espèce de l’individu.
Il existe deux façons d’ajouter de la couleur à un graphique {ggplot2}
:
colorer l’ensemble des éléments (points, lignes, …) avec une même couleur
colorer chaque élément en fonction d’une autre variable (ici l’espèce)
Pour colorer l’ensemble des points, nous ajoutons un argument color
(colour
et col
fonctionnent également) en dehors des parenthèses définissant l’esthétique du graphique :
+
g geom_point(col = "darkblue")
L’argument alpha
permet de définir la transparence des points. Il prend une valeur numérique entre 0 (transparent) et 1 (opaque) :
+
g geom_point(col = "darkblue", alpha = 0.5)
Vous pouvez utiliser des couleurs prédéfinies (voir la liste ici).
Vous pouvez également utiliser des codes hexadécimaux ou encore des couleurs RGB à l’aide de la fonction rgb()
:
+ geom_point(col = "darkblue")
g + geom_point(col = "#00008b")
g + geom_point(col = rgb(red = 0, green = 0, blue = 139, maxColorValue = 255)) g
Pour colorer les points selon l’espèce, nous plaçons l’argument color
dans une parenthèse aes()
en précisant la variable à utiliser pour définir les groupes d’individus :
+
g geom_point(aes(col = espece))
Une légende permettant de différencier les groupes a été ajoutée à droite du graphique.
Lorsque vous créez un graphique avec {ggplot2}
, l’ordre des arguments peut varier. Si vous n’utilisez qu’un seul jeu de données, vous pouvez définir plusieurs arguments dans la parenthèse ggplot()
. Si votre graphique utilisera plusieurs jeux de données, vous préciserez dans chaque couche quelles données utiliser. Les paramètres esthétiques définis dans la parenthèse ggplot()
seront appliqués à l’ensemble des couches, alors que ceux définis dans une parenthèse geom()
ne concerneront que cette couche.
Voici plusieurs manières d’écrire le code pour créer un même graphique :
ggplot(data = pingouins) +
geom_point(aes(x = longueur_aile_mm, y = longueur_bec_mm, col = espece))
ggplot(data = pingouins, aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece))
ggplot(data = pingouins, aes(x = longueur_aile_mm, y = longueur_bec_mm,
col = espece)) +
geom_point()
ggplot() +
geom_point(data = pingouins, aes(x = longueur_aile_mm, y = longueur_bec_mm,
col = espece))
Modifier l’apparence des points
L’argument shape
permet de changer la forme des points. Comme pour la couleur, vous pouvez utiliser une seule forme pour l’ensemble des points, ou utiliser différentes formes pour représenter des groupes.
La forme des points peut être précisées à l’aide :
d’un code numérique :
d’un nom (
square
,circle
,diamond
, …)
Modifions la forme de l’ensemble des points :
+
g geom_point(shape = 5,
aes(col = espece))
Utilisons différentes formes en fonction de l’île :
+
g geom_point(aes(col = espece, shape = ile))
L’argument size
permet de modifier la taille des points. Là encore, nous pouvons définir une même taille pour l’ensemble des points, ou représenter une variable continue de nos données à l’aide de la taille.
Augmentons la taille de l’ensemble des points :
+
g geom_point(shape = 5, size = 3,
aes(col = espece))
Utilisons la taille pour représenter la masse des pingouins :
+
g geom_point(aes(col = espece, shape = ile, size = masse_corporelle_g))
stroke
Les formes 21 à 25 peuvent prendre plusieurs arguments :
color
: couleur du contour
fill
: couleur de remplissage
stroke
: largeur du contour
Ajouter et modifier des titres
La fonction labs()
permet d’ajouter ou de modifier des titres à notre graphique :
+
g geom_point(aes(col = espece)) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)")
Nous pouvons également utiliser les fonctions ggtitle()
, xlab()
et ylab()
:
+
g geom_point(aes(col = espece)) +
ggtitle(label = "Pingouins de l'archipel Palmer",
subtitle = "Donnnées pour 3 espèces sur 3 îles") +
labs(caption = "Données issues du package {Palmer penguins}") +
xlab("Longueur des ailes (mm)") +
ylab("Longueur du bec (mm)")
Histogramme
Nous souhaitons visualiser la distribution de la masse des pingouins. Nous allons pour cela utiliser la fonction geom_histogram()
:
ggplot(data = pingouins,
aes(x = masse_corporelle_g)) +
geom_histogram()
Pour bien différencier les barres, nous utilisons l’argument col
pour colorer leur contour (l’argument fill
permet de colorer l’intérieur) :
ggplot(data = pingouins,
aes(x = masse_corporelle_g)) +
geom_histogram(col = "white")
Lorsque vous exécutez le code ci-dessus, la console affiche le message suivant : stat_bin() using bins = 30. Pick better value with binwidth
.
Par défaut, un histogramme contient 30 classes. L’argument bins
permet de changer le nombre de classes. N’hésitez pas à en essayer plusieurs !
ggplot(data = pingouins,
aes(x = masse_corporelle_g)) +
geom_histogram(col = "white", bins = 20)
L’argument bin_width
permet de modifier la largeur de chaque classe le long de l’axe x :
ggplot(data = pingouins,
aes(x = masse_corporelle_g)) +
geom_histogram(col = "white", binwidth = 200)
Cet histogramme ne nous renseigne pas sur la distribution de notre variable d’intérêt en fonction de l’espèce. Nous allons pour cela ajouter de la couleur à nos barres :
ggplot(data = pingouins,
aes(x = masse_corporelle_g)) +
geom_histogram(aes(fill = espece),
alpha = 0.5,
binwidth = 200)
Les barres des histogrammes peuvent être arrangées de trois façons différentes à l’aide de l’argument position
:
position = "stack"
:
position = "identity"
:
position = "dodge"
:
Ajoutons des titres à notre graphique et modifions les titres des axes :
ggplot(data = pingouins,
aes(x = masse_corporelle_g)) +
geom_histogram(aes(fill = espece),
position = "stack",
alpha = 0.5,
binwidth = 200) +
labs(title = "Distribution de la masse corporelle",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "Masse corporelle (g)",
y = "Fréquence")
Boîtes à moustaches
Les trois espèces ont-elles des hauteurs de becs similaires ? Pour répondre à cette question, nous allons utiliser un graphique en boites à moustaches à l’aide de geom_boxplot()
:
ggplot(data = pingouins,
aes(x = espece, y = hauteur_bec_mm, col = espece)) +
geom_boxplot()
Dans le cas présent, la légende n’est pas nécessaire, car les noms des espèces sont indiqués le long de l’axe x. Pour supprimer la légende, nous utilisons l’argument show.legend = FALSE
:
ggplot(data = pingouins,
aes(x = espece, y = hauteur_bec_mm, col = espece)) +
geom_boxplot(show.legend = FALSE)
Nous aimerions inverser les axes de notre graphique. Nous pouvons le faire de deux façons :
- inverser les axes x et y dans les paramètres esthétiques
ggplot(data = pingouins,
aes(x = hauteur_bec_mm, y = espece, col = espece)) +
geom_boxplot(show.legend = FALSE)
- utiliser la fonction
coord_flip()
ggplot(data = pingouins,
aes(x = espece, y = hauteur_bec_mm, col = espece)) +
geom_boxplot(show.legend = FALSE) +
coord_flip()
L’argument width
permet de modifier la taille des boîtes :
ggplot(data = pingouins,
aes(x = espece, y = hauteur_bec_mm, col = espece)) +
geom_boxplot(width = 0.25, show.legend = FALSE) +
coord_flip()
Ajoutons des titres à notre graphique et modifions les titres des axes :
ggplot(data = pingouins,
aes(x = espece, y = hauteur_bec_mm, col = espece)) +
geom_boxplot(width = 0.25, show.legend = FALSE) +
labs(title = "Hauteur des becs",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "Hauteur du bec (mm)") +
coord_flip()
Diagramme en barres
Nous allons visualiser le nombre d’individus par espèce à l’aide de geom_bar()
:
ggplot(data = pingouins,
aes(x = espece)) +
geom_bar(aes(fill = espece),
width = 0.75,
show.legend = FALSE)
Nous aimerions classer les espèces par ordre décroissant de nombre d’individus. Pour cela, nous allons utliser la fonction fct_infreq()
du package {forcats}
qui permet de trier les niveaux d’un facteur. Cette approche est intéressante car elle est dynamique : R effectue directement le tri sans passer par un objet intermédiaire.
ggplot(data = pingouins,
aes(x = fct_infreq(espece))) +
geom_bar(aes(fill = espece),
width = 0.75,
show.legend = FALSE)
Comme vu précédemment, nous pouvons modifier l’orientation des barres à l’aide de coord_flip()
.
Gardez bien à l’esprit que sur votre graphique, le premier niveau d’un facteur se situe au plus près de l’origine.
Dans notre cas, si nous représentons des barres horizontales, l’espèce ayant le plus grand nombre d’individus se situera donc en bas du graphique. Pour corriger cela, nous utilisons la fonction fct_rev()
ggplot(data = pingouins,
aes(x = fct_rev(fct_infreq(espece)))) +
geom_bar(aes(fill = espece),
width = 0.75,
show.legend = FALSE) +
coord_flip()
Ajoutons des titres à notre graphique et modifions les titres des axes :
ggplot(data = pingouins,
aes(x = fct_rev(fct_infreq(espece)))) +
geom_bar(aes(fill = espece),
width = 0.75,
show.legend = FALSE) +
labs(title = "Nombre d'individus",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "") +
coord_flip()
Graphiques multiples
Reprenons notre graphique représentant le rapport entre la longueur et la hauteur du bec :
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece)) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)")
Nous souhaitons séparer ce graphique afin de représenter les données par espèce ou encore par espèce et par île. Nous allons utiliser pour cela les fonctions facet_wrap()
et facet_grid()
.
facet_wrap()
Nous ajoutons simplement une couche à notre code, en précisant à l’aide d’un tilde ~
quelle variable utiliser pour séparer les données :
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece)) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)") +
facet_wrap(~espece)
Des étiquettes sont automatiquement ajoutées pour indiquer les différentes espèces représentées. Nous pouvons donc supprimer la légende :
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece),
show.legend = FALSE) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)") +
facet_wrap(~espece)
L’option dir
permet de modifier l’orientation des graphiques :
- dir = "h"
: oritentation horizontale (par défaut)
- dir = "v"
: orientation verticale
L’option strip.position
permet de modifier l’emplacement des étiquettes : - strip.position = "top"
: au-dessus des graphiques (par défaut)
- strip.position = "right"
: à droite des graphiques
- strip.position = "bottom"
: en-dessous des graphiques
- strip.position = "left"
: à gauche des graphiques
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece),
show.legend = FALSE) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)") +
facet_wrap(~espece,
dir = "v",
strip.position = "right")
L’option scales
permet d’ajuster l’échelle des graphiques :
scales = "fixed"
: même échelle pour tous les graphiques (par défaut)
scales = "free"
: ajuster l’échelle des deux axes pour chaque graphique
scales = "free_x"
: même échelle sur l’axe y et échelle ajustée sur l’axe x
scales = "free_y"
: même échelle sur l’axe x et échelle ajustée sur l’axe y
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece),
show.legend = FALSE) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)") +
facet_wrap(~espece,
dir = "v",
strip.position = "right",
scales = "free_y")
facet_grid()
La fonction facet_grid()
permet de séparer un graphique selon deux variables discrètes (ou variables catégorielles). La syntaxe est la même que pour la fonction facet_wrap()
: nous précisons à l’aide d’un tilde ~
les variables à utiliser pour séparer les données selon des lignes et des colonnes : facet_grid(lignes ~ colonnes)
.
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece),
show.legend = FALSE) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)") +
facet_grid(espece ~ ile)
Toutes les combinaisons possibles sont affichées, c’est la raison pour laquelle certaines cases sont vides (aucune observation pour la combinaison).
L’option switch
permet de modifier la position des étiquettes :
- switch = "x"
: étiquettes de l’axe x en bas du graphique
- switch = "y"
: étiquettes de l’axe y à gauche du graphique
- switch = "both"
pour effectuer les deux modifications simultanément
ggplot(data = pingouins,
aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece),
show.legend = FALSE) +
labs(title = "Pingouins de l'archipel Palmer",
subtitle = "Données pour 3 espèces sur 3 îles",
caption = "Données issues du package {Palmer penguins}",
x = "Longueur des ailes (mm)",
y = "Longueur du bec (mm)") +
facet_grid(espece ~ ile, switch = "x")
Utilisation du pipe %>%
Nous avions vu dans un autre tutoriel comment enchaîner les opérations à l’aide du pipe %>%
.
Nous pouvons utiliser le pipe pour générer un graphique. Cette façon de procéder permet de manipuler les données utilisées pour créer le graphique sans avoir besoin de multiplier les objets intermédiaires. En utilisant le pipe %>%
pour créer un graphique, nous pouvons également profiter de l’auto-complétion à l’aide de la touche Tab
pour préciser les variables :
%>%
pingouins ggplot(aes(x = longueur_aile_mm, y = longueur_bec_mm,
col = espece)) +
geom_point()
Améliorer ses graphiques
{ggplot2}
propose une multitude de paramètres permettant la personnalisation des graphiques. Les possibilités sont quasimment infinies ! Nous allons voir comment améliorer nos graphiques avec certaines de ces options.
Les couleurs
Utiliser des palettes
Il existe plusieurs palettes de couleurs :
Deux fonctions permettent d’utiliser ces palettes :
scale_color_brewer()
: appliquer la palette au paramètrecol
scale_fill_brewer()
: appliquer la palette au paramètrefill
Nous utiliserons l’une ou l’autre de ces fonctions ou les deux selon les paramètres esthétiques de notre graphique. Nous pouvons par exemple choisir d’appliquer une palette pour remplir des points en gardant un contour noir :
%>%
pingouins ggplot(aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(shape = 21, size = 5, col = "black",
aes(fill = espece)) +
scale_fill_brewer(palette = "Accent")
Il existe beaucoup d’autres palettes, disponibles via des packages, dont la liste est accessible ici.
Définir des couleurs
Deux fonctions permettent de définir nous-mêmes les couleurs à utiliser :
scale_color_manual()
: appliquer les couleurs au paramètrecol
scale_fill_manual()
: appliquer les couleurs au paramètrefill
%>%
pingouins ggplot(aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece)) +
scale_color_manual(values = c("Adelie" = "darkorange",
"Chinstrap" = "purple",
"Gentoo" = "cyan4"))
Si notre graphique contient plusieurs couches utilisant les mêmes couleurs, nous pouvons créer un vecteur de couleurs pour éviter de devoir taper plusieurs fois le même code :
<- c("darkorange", "purple", "cyan4")
custom.cols names(custom.cols) <- c("Adelie", "Chinstrap", "Gentoo")
%>%
pingouins ggplot(aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece)) +
scale_color_manual(values = custom.cols)
Il est important d’associer un niveau (un nom d’espèce) à chaque couleur. Cela permettra de toujours associer une certaine couleur à une même espèce, et évitera des changements de couleurs si nous manipulons les données avant de générer le graphique.
Combiner plusieurs types de graphiques
Reprenons notre graphique en boîtes à moustaches :
ggplot(data = pingouins,
aes(x = espece, y = hauteur_bec_mm, col = espece)) +
geom_boxplot(width = 0.25, show.legend = FALSE) +
labs(title = "Hauteur des becs",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "Hauteur du bec (mm)") +
coord_flip()
Apportons quelques modifications et utilisons les mêmes couleurs :
- lwd
permet de définir l’épaisseur des traits des boîtes
- alpha
permet d’ajuster la transparence de la couleur de remplissage de la boîte (fill
)
Une option permet de supprimer les données aberrantes du graphique : outlier.shape = NA
<- c("darkorange", "purple", "cyan4")
custom.cols names(custom.cols) <- c("Adelie", "Chinstrap", "Gentoo")
%>%
pingouins ggplot(aes(x = espece, y = hauteur_bec_mm)) +
geom_boxplot(aes(col = espece, fill = espece),
width = 0.25, lwd = 0.5, alpha = 0.25,
show.legend = FALSE) +
scale_color_manual(values = custom.cols) +
scale_fill_manual(values = custom.cols) +
labs(title = "Hauteur des becs",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "Hauteur du bec (mm)") +
coord_flip()
Nous pouvons superposer à ces boîtes à moustaches l’affichage des données pour visualiser la distribution des observations. Nous ajoutons pour cela une couche geom_point()
.
%>%
pingouins ggplot(aes(x = espece, y = hauteur_bec_mm)) +
geom_boxplot(aes(col = espece, fill = espece),
width = 0.25, lwd = 0.5, alpha = 0.25,
show.legend = FALSE) +
geom_point(aes(col = espece, fill = espece),
show.legend = FALSE) +
scale_color_manual(values = custom.cols) +
scale_fill_manual(values = custom.cols) +
labs(title = "Hauteur des becs",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "Hauteur du bec (mm)") +
coord_flip()
Nous aimerions espacer les points pour rendre le graphique plus lisible. Nous utilisons pour cela une variation du nuage de points, à l’aide de la fonction geom_jitter()
. Les paramètres width
et height
permettent d’ajuster respectivement l’étalement en largeur et en hauteur du nuage.
%>%
pingouins ggplot(aes(x = espece, y = hauteur_bec_mm)) +
geom_boxplot(aes(col = espece, fill = espece),
width = 0.25, lwd = 0.5, alpha = 0.25,
show.legend = FALSE) +
geom_jitter(aes(col = espece),
width = 0.1, alpha = 0.25, show.legend = FALSE) +
scale_color_manual(values = custom.cols) +
scale_fill_manual(values = custom.cols) +
labs(title = "Hauteur des becs",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "Hauteur du bec (mm)") +
coord_flip()
L’utilisation de width
ou height
dépendra de la répartition des variables le long des axes x et y, ainsi que de l’utilisation de coord_flip()
.
Ajouter du texte
Reprenons notre graphique en barres et modifions les couleurs comme nous l’avons fait pour les autres graphiques :
<- c("darkorange", "purple", "cyan4")
custom.cols names(custom.cols) <- c("Adelie", "Chinstrap", "Gentoo")
%>%
pingouins ggplot(aes(x = fct_rev(fct_infreq(espece)),
fill = espece)) +
geom_bar(width = 0.75,
show.legend = FALSE) +
scale_fill_manual(values = custom.cols) +
labs(title = "Nombre d'individus",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "") +
coord_flip()
Nous aimerions ajouter des étiquettes indiquant le nombre d’individus par espèce. Nous utilisons pour cela la fonction geom_text()
avec les options suivantes :
aes(label = ..count..)
: indique que les étiquettes contiendront le nombre d’observations par niveau de variable utilisé pour générer les barres (ici les espèces)
stat = "count"
: indique le calcul à effectuer, ici un simple comptage
hjust = 1.5
: alignement horizontal des étiquettes, que nous souhaitons placer à l’intérieur des barres
col = "white"
: couleur du texte des étiquettes
size = 5
: taille de la police du texte
<- c("darkorange", "purple", "cyan4")
custom.cols names(custom.cols) <- c("Adelie", "Chinstrap", "Gentoo")
%>%
pingouins ggplot(aes(x = fct_rev(fct_infreq(espece)),
fill = espece)) +
geom_bar(width = 0.75,
show.legend = FALSE) +
geom_text(aes(label = ..count..),
stat = "count",
hjust = 1.5,
col = "white", size = 5) +
scale_fill_manual(values = custom.cols) +
labs(title = "Nombre d'individus",
subtitle = "Données pour 3 espèces de pingouins sur 3 îles de l'archipel Palmer",
caption = "Données issues du package {Palmer penguins}",
x = "",
y = "") +
coord_flip()
Les thèmes de {ggplot2}
Le fond grisé du graphique est proposé par défaut par {ggplot2}
: il s’agit d’un thème définissant l’apparence générale d’un graphique : couleur de l’arrière-plan, de la grille, présence d’un cadre, …
Il existe plusieurs thèmes prédéfinis qui peuvent être appliqués à un graphique à l’aide de la fonction theme_...()
:
<- c("darkorange", "purple", "cyan4")
custom.cols names(custom.cols) <- c("Adelie", "Chinstrap", "Gentoo")
%>%
pingouins ggplot(aes(x = longueur_aile_mm, y = longueur_bec_mm)) +
geom_point(aes(col = espece)) +
scale_color_manual(values = custom.cols) +
theme_...()
Les quatre composants d’un ggplot
Un graphique est composé de quatre éléments, dont chacun peut être paramatré à l’aide de multiples options :
Le “panel” : zone contenant les éléments géométriques de notre graphique (nuage de points, barres, …)
Le “plot” : zone qui entoure le panel et qui contient le titre, le sous-titre, …
Les axes du graphiques avec leurs titres, les graduations, …
La légende qui permet d’expliquer à quoi correspondent les couleurs, les formes , …
Ces paramètres sont précisés dans une parenthèse theme()
à ajouter à la suite du code servant à générer notre graphique.
Commençons par créer un graphique simple :
<- pingouins %>%
(p ggplot(aes(x = longueur_bec_mm, y = hauteur_bec_mm)) +
geom_point(aes(col = espece),
size = 3, alpha = 0.5) +
scale_color_manual(values = custom.cols) +
labs(title = "Rapport entre la hauteur et la longueur du bec",
subtitle = "pour trois espèces de pingouins de l'archipel Palmer",
x = "Longueur du bec (mm)",
y = "Hauteur du bec (mm)")
)
Les parenthèses qui entourent le code ci-dessus permettent de l’exécuter et d’afficher le résultat.
Par défaut, le titre de la légende reprend le nom de la variable utilisée pour définir les groupes. Nous pouvons modifier ce titre à l’intérieur de la parenthèse labs()
. Dans le graphique ci-dessus, nous avions défini les paramètres esthétiques suivants : geom_point(aes(col = espece))
. Nous allons donc renommer l’élément col
de notre légende (si nous avions utilisé geom_point(aes(fill = espece))
nous renommerions l’élément fill
) :
<- pingouins %>%
(p ggplot(aes(x = longueur_bec_mm, y = hauteur_bec_mm)) +
geom_point(aes(col = espece),
size = 3, alpha = 0.5) +
scale_color_manual(values = custom.cols) +
labs(title = "Rapport entre la hauteur et la longueur du bec",
subtitle = "pour trois espèces de pingouins de l'archipel Palmer",
x = "Longueur du bec (mm)",
y = "Hauteur du bec (mm)",
col = "ESPECES")
)
Le “panel”
Les modifications s’effectuent à l’aide de la syntaxe suivante :
theme(
-du-parametre-1 = element_...(),
nom-du-parametre-2 = element_...()
nom )
La fonction element_...()
dépendra de ce que nous souhaitons modifier :
element_rect()
pour modifier une zone rectangulaire (panel.background)element_line()
pour modifier des lignes (panel.border)element_text()
pour modifier du texte
La fonction element_blank()
permet de supprimer un élément du graphique.
Nous allons effectuer les modifications suivantes :
modifier la couleur de l’arrière-plan | panel.background = element_rect() |
modifier la couleur de la bordure | panel.border = element_rect() |
supprimer les graduations mineures | panel.grid.minor = element_blank() |
modifier les graduations majeures | panel.grid.major = element_line() |
<- p +
(p1 theme(
panel.background = element_rect(fill = "lightcyan"),
panel.border = element_rect(fill = NA, color = "black", linewidth = 1.5),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "black", linetype = "dotted")
) )
Le “plot”
Les options plot.title()
, plot.subtitle()
et plot.caption()
permettent de modifier la taille, la couleur et l’alignement du texte des titres et sous-titres du graphique.
L’option plot.margin
permet de modifier la marge entre la zone de “plot” et les bords du graphiques. Une marge se définit à l’aide de quatre valeurs numériques, une pour chaque côté du graphique (ou de l’élément autour duquel on modifie les marges). La fonction plot.margin
s’utilise de la manière suivante : plot.margin = margin(top = ..., right = ..., bottom = ..., left = ...)
. On peut également utiliser les abbréviations margin(t = ..., r = ..., b = ..., l = ...)
ou simplement indiquer les quatre valeurs numériques dans l’ordre. Pour ne modifier la marge que d’un seul côté, il suffit de préciser quel côté est concerné : margin(l = ...)
.
La fonction margin()
peut également être utilisée pour modifier les marges autour du texte du graphique (titre, axes, …).
Nous allons effectuer les modifications suivantes :
modifier la couleur de l’arrière-plan | plot.background = element_rect() |
augmenter les marges | plot.margin = margin() |
modifier le titre | plot.title = element_text() |
modifier le sous-titre | plot.subtitle = element_text() |
Par défaut, l’alignement du titre et du sous-titre se sont par rapport à la zone “panel”. Pour que l’alignement se fasse par rapport à la zone “plot”, c’est-à-dire l’ensemble du graphique, nous pouvons ajouter l’option plot.title.position = "plot"
<- p1 +
(p2 theme(
plot.background = element_rect(fill = "lightcyan"),
plot.margin = margin(10, 10, 10, 10),
plot.title.position = "plot",
plot.title = element_text(color = "steelblue4",
size = 20,
hjust = 0.5),
plot.subtitle = element_text(color = "steelblue4",
size = 15,
hjust = 0.5,
margin = margin(b = 10))
) )
Les axes
Nous allons effectuer les modifications suivantes :
modifier les titres des axes | axis.title = element_text() |
modifier le texte des axes | axis.text = element_text() |
supprimer les marques de graduation | axis.ticks = element_blank() |
Nous pouvons modifier ces paramètres de différentes manières :
axis.title.x
: modifier le texte de l’axe x
axis.title.y
: modifier le texte de l’axe y
axis.title
: modifier le texte des deux axes
La façon de procéder dépendra de ce que l’on souhaite modifier. Si nous voulons seulement augmenter la taille de la police des titres, nous utiliserons axis.title
. Si nous souhaitons modifier les marges autour des titres des deux axes, il nous faudra utiliser axis.title.x
et axis.title.y
. En effet, les marges ne tiennent pas compte de l’orientation du texte. Pour augmenter l’espace entre les titres des deux axes et la zone “panel”, il nous faudra procéder en deux étapes :
- augmenter la marge supérieure (top) pour le titre de l’axe x
- augmenter la marge à droite (right) pour le titre de l’axe y
hjust
et vjust
A la différence de margin
, hjust
et vjust
prennent en compte l’orientation du texte.
<- p2 +
(p3 theme(
axis.title.x = element_text(color = "steelblue",
size = 15,
margin = margin(t = 10)),
axis.title.y = element_text(color = "steelblue",
size = 15,
margin = margin(r = 10)),
axis.text = element_text(color = "steelblue",
size = 15),
axis.ticks = element_blank()
) )
La légende
Nous allons effectuer les modifications suivantes :
modifier l’arrière-plan | legend.background = element_rect() |
modifier la boîte | legend.key = element_rect() |
supprimer le titre | legend.title = element_blank() |
modifier le texte | legend.text = element_text() |
modifier l’emplacemen | legend.position |
Nous pourrions également modifier l’orientation de la légende à l’aide de l’option legend.direction = "horizontal
.
Nous allons placer la légende sous le sous-titre et au-dessus du graphique.
Si nous avions fait le choix d’aligner le titre et le sous-titre par rapport à la zone de “plot”, il nous faudrait alors supprimer ce paramètre (ou commenter la ligne de code concernée) pour que l’alignement se fasse par rapport à l’ensemble de la figure.
<- p3 +
(p4 theme(
legend.background = element_rect(fill = "lightcyan"),
legend.key = element_rect(fill = "lightcyan"),
legend.title = element_blank(),
legend.text = element_text(color = "steelblue",
size = 15),
legend.position = "top"
) )
guides
Nous pouvons remarquer que les points utilisés pour la légende reprennent les paramètres esthétiques du graphique, à savoir la taille et la transparence.
Pour rendre la légende plus claire, nous pouvons appliquer des paramètres esthétiques uniquement à la légende, à l’aide des guides
:
<- p4 +
(p5 guides(color = guide_legend(override.aes = list(alpha = 1, size = 5)))
)
Sauvegarder un graphique
Jusqu’à présent, nos graphiques apparaissaient dans l’onglet Plots mais n’étaient pas sauvegardés.
Nous pouvons sauvegarder notre graphique de deux manières :
directement depuis l’onglet Plot
en ligne de commande avec
ggsave()
Depuis l’onglet Plots
L’onglet Plots vous permet de naviguer entre vos graphiques, d’ouvrir le graphique actuellement affiché dans une nouvelle fenêtre, d’exporter votre graphique, de le supprimer ou de supprimer tous les graphiques de la session de travail.
En cliquant sur Export, vous avez trois options :
sauvegarder le graphique sous forme d’image
sauvegarder le graphique au format PDF
copier le graphique dans le presse-papiers (par exemple pour le coller dans un document)
Nous allons exporter notre graphique sous forme d’image : cliquez sur Export puis Save as image.
Nous avons alors le choix entre plusieurs extensions (.png
, .jpeg
, …).
Nous pouvons également :
redimensionner notre graphique (en convervant ou non le rapport des dimensions)
choisir le dossier de destination
modifier le nom du graphique (le nom proposé par défaut n’est pas très explicite …)
Avec ggsave()
Cette fonction permet d’exporter un graphique au format .png dans un répertoire, avec les dimensions et la résolution de notre choix :
ggsave("figs/pingouins_rapport_bec.png", p5, dpi = 320, width = 12, height = 6)
Le paramètre dpi
indique la résolution de l’image en pixels.
Il est toujours utile d’exporter son graphique et de vérifier le rendu pour rectifier les paramètres si nécessaire. Il n’est en effet pas rare d’avoir quelques surprises en ouvrant notre graphique exporté au format .png : taille de la police, des éléments graphiques, …
Cet article explique en détail comment paramétrer la taille et la résolution d’une image.