ggplot2
Informatique — R, chapitre 9
Les graphiques du chapitre précédent se dessinent : on trace, puis on ajoute par-dessus. ggplot2 procède autrement — on décrit une figure, couche par couche, et R la compose. La différence paraît subtile ; elle change tout dès qu’une figure doit être reprise, déclinée ou publiée.
9.1 La grammaire des graphiques
Toute figure ggplot2 combine trois éléments obligatoires :
| Élément | Rôle | Écriture |
|---|---|---|
| les données | un tableau, toujours | ggplot(d, ...) |
| l’esthétique | quelle colonne sur quel canal visuel | aes(x = , y = , color = ) |
| la géométrie | quelle forme dessiner | geom_point(), geom_line()… |
ggplot(d, aes(x = pib, y = chomage)) +
geom_point()Trois lignes qui se lisent comme une phrase : prends le tableau d, place pib en abscisse et chomage en ordonnée, et représente chaque observation par un point.
+ se met en fin de ligne
ggplot(d, aes(x, y))
+ geom_point() # ERREURComme pour le else du chapitre 6, R considère l’instruction terminée à la fin de la première ligne. Le + doit terminer la ligne, jamais la commencer.
9.2 Les géométries
9.2.1 Les plus employées
| Géométrie | Figure produite |
|---|---|
geom_point() |
nuage de points |
geom_line() |
ligne — série temporelle |
geom_col() |
barres à partir de valeurs |
geom_bar() |
barres à partir d’effectifs, comptés automatiquement |
geom_histogram() |
histogramme |
geom_boxplot() |
boîte à moustaches |
geom_smooth() |
courbe d’ajustement, avec intervalle |
9.2.2 Superposer, sans effacer
ggplot(d, aes(x = pib, y = chomage)) +
geom_point(size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, color = "#c8542f")Le nuage, puis la droite des moindres carrés avec son intervalle de confiance. se = FALSE retire la bande ; method = "loess" remplace la droite par un lissage local.
Une figure ggplot2 est un objet, qu’on peut stocker et reprendre :
p <- ggplot(d, aes(pib, chomage)) + geom_point()
p # l'afficher
p + geom_smooth(method = "lm") # une variante
p + labs(title = "Autre titre") # une autreAvec les graphiques de base, chaque variante exigeait de retracer la séquence entière. Ici l’objet p reste intact et sert de socle. C’est ce qui rend ggplot2 supérieur dès qu’une figure doit être déclinée.
9.3 L’esthétique : faire porter une information par la forme
9.3.1 Dans aes ou en dehors ?
C’est la question qui déroute au début. La règle est pourtant nette.
geom_point(color = "blue") # tous les points en bleu
geom_point(aes(color = region)) # une couleur PAR REGIONDans aes, un attribut visuel est relié à une colonne : la couleur devient porteuse d’information et une légende apparaît. En dehors, c’est une valeur fixe appliquée à tout.
aes mal placé
geom_point(aes(color = "blue"))Tous les points ressortent rouges, avec une légende intitulée « blue ». ggplot2 a compris que vous vouliez colorer selon une variable qui vaut partout la chaîne "blue" — il n’y a donc qu’une modalité, à laquelle il attribue sa première couleur.
Une couleur fixe se déclare hors de aes.
9.3.2 Les canaux disponibles
| Canal | Convient à |
|---|---|
color |
une qualitative, ou le contour d’une forme |
fill |
l’intérieur d’une forme — barres, boîtes |
shape |
une qualitative, jusqu’à six modalités |
size |
une quantitative |
alpha |
la transparence — utile quand les points se superposent |
linetype |
style de trait |
ggplot(d, aes(x = pib, y = chomage, color = region, shape = region)) +
geom_point(size = 3)Coder la même variable par la couleur et la forme rend la figure lisible en noir et blanc comme pour un lecteur daltonien — la règle énoncée au chapitre précédent.
9.4 Découper en petits multiples
ggplot(d, aes(x = annee, y = pib)) +
geom_line() +
facet_wrap(~ region)facet_wrap produit une figure par modalité, aux mêmes échelles, disposées en grille. C’est l’une des fonctions les plus utiles de ggplot2 : là où le système de base demanderait une boucle et un par(mfrow), une ligne suffit.
facet_wrap(~ region, ncol = 2) # deux colonnes
facet_wrap(~ region, scales = "free_y") # echelles y independantes
facet_grid(secteur ~ region) # une grille a deux variablesPar défaut, toutes les facettes partagent les mêmes axes — ce qui rend les niveaux comparables entre panneaux. C’est presque toujours ce que l’on veut.
scales = "free_y" libère l’axe vertical : chaque panneau utilise toute sa hauteur. Cela révèle mieux la forme de chaque série, mais interdit de comparer les niveaux. Choisissez selon la question posée, et dites-le en légende.
9.5 Habiller
9.5.1 Titres et étiquettes
ggplot(d, aes(pib, chomage, color = region)) +
geom_point(size = 3) +
labs(title = "Chomage et richesse regionale",
subtitle = "Maroc, 2023",
x = "PIB (milliards de dirhams)",
y = "Taux de chomage (%)",
color = "Region",
caption = "Source : HCP")labs renomme tout, y compris le titre de la légende — qui porte le nom du canal esthétique (color, fill, shape).
9.5.2 Les thèmes
p + theme_minimal() # fond blanc, grille discrete
p + theme_bw() # cadre noir, classique en publication
p + theme_classic() # deux axes seulement, sans grilletheme_minimal(base_size = 14) agrandit toutes les polices d’un coup — le réglage à faire pour une projection en amphithéâtre.
p + theme_minimal(base_size = 13) +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold"))9.5.3 Les échelles
p + scale_y_continuous(limits = c(0, 20)) # borner un axe
p + scale_x_log10() # echelle log
p + scale_color_brewer(palette = "Set2") # palette qualitative
p + scale_color_viridis_d() # palette lisible par tousscale_y_continuous(limits = c(0, 20)) supprime les observations hors bornes — un ajustement linéaire calculé ensuite ne portera pas sur toutes les données.
coord_cartesian(ylim = c(0, 20)) se contente de zoomer : rien n’est retiré du calcul.
Pour cadrer une figure sans fausser un ajustement, utilisez coord_cartesian. ggplot2 avertit du nombre de lignes retirées dans le premier cas — lisez ces messages, ils sont là pour cela.
9.6 Enregistrer
ggsave("figure.png", width = 8, height = 5, dpi = 300)
ggsave("figure.pdf", plot = p, width = 8, height = 5)ggsave enregistre la dernière figure affichée si l’on ne précise rien, et devine le format d’après l’extension. Plus simple que la séquence png() … dev.off() du chapitre précédent, et sans risque d’oublier la fermeture.
Les dimensions sont en pouces. Pour un article sur deux colonnes, width = 6.5 correspond à la largeur d’une page A4 avec marges.
À vous
À partir d’un tableau contenant pib, chomage et region, écrivez la figure suivante : un nuage de points coloré et différencié par région, une droite d’ajustement par région, des titres complets, le thème minimal, et un enregistrement en PDF.
library(ggplot2)
p <- ggplot(d, aes(x = pib, y = chomage,
color = region, shape = region)) +
geom_point(size = 3, alpha = 0.8) +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Chomage et richesse regionale",
x = "PIB (milliards de dirhams)",
y = "Taux de chomage (%)",
color = "Region", shape = "Region") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")
p
ggsave("chomage_pib.pdf", plot = p, width = 8, height = 5)Notez que color et shape doivent recevoir le même titre dans labs, sans quoi ggplot2 affiche deux légendes séparées pour la même variable.
Ce qu’il faut retenir
| Écriture | Effet |
|---|---|
ggplot(d, aes(x, y)) + geom_*() |
les trois éléments obligatoires |
+ en fin de ligne |
jamais en début |
aes(color = var) |
la couleur porte une information |
color = "blue" hors de aes |
couleur fixe |
geom_point, geom_line, geom_col, geom_boxplot |
les géométries usuelles |
geom_smooth(method = "lm") |
ajustement avec intervalle |
facet_wrap(~ var) |
une figure par modalité |
labs |
titres, axes, et titre de légende |
theme_minimal(base_size = 14) |
thème et taille de police |
coord_cartesian(ylim = ) |
zoomer sans supprimer d’observations |
ggsave |
enregistrer, format déduit de l’extension |
p <- ggplot(...) |
la figure est un objet réutilisable |
Le dernier chapitre complète ggplot2 par son compagnon naturel : dplyr, qui prépare les tableaux que ces figures représentent.