Menu

ggplot2 en R : guide du débutant à la grammaire des graphiques

Comment fonctionne ggplot2 - le modèle mental données + aes() + geom, associer ou fixer une esthétique, labs(), facet_wrap(), les thèmes, et l'export avec ggsave().

ggplot2 construit les graphiques par couches

ggplot2 est le package graphique le plus utilisé de R, et la raison pour laquelle on jure par lui est une idée de conception : la grammaire des graphiques. R de base te donne une fonction par graphique - plot(), hist(), barplot() - chacune avec ses propres arguments. ggplot2 te donne à la place un petit ensemble de pièces combinables - un jeu de données, une correspondance des colonnes vers des propriétés visuelles, et des couches de dessin - qui se combinent avec + en n'importe quel graphique. Apprends la grammaire une fois et chaque nouveau type de graphique est la même phrase avec un mot changé. En prime, les réglages par défaut (panneau gris, axes sensés, légendes automatiques) sont présentables sans le moindre effort de style.

C'est un package additionnel, il demande donc une installation unique et un chargement par session :

install.packages("ggplot2")   # once, on your machine
library(ggplot2)              # at the top of every script that uses it

Une attente à connaître d'emblée : ggplot2 veut un data frame (pas des vecteurs isolés), idéalement au format long et bien rangé - une ligne par observation, une colonne par variable. Si tes données sont larges, les pivoter en long d'abord dissout généralement ce qui ressemblait à un problème de graphique.

Le modèle mental : données, correspondance, géométrie

Chaque ggplot répond à trois questions, une par partie :

  1. Données - quel data frame ? ggplot(mtcars, ...)
  2. Correspondance - quelles colonnes pilotent quelles propriétés visuelles ? aes(x = wt, y = hp)
  3. Géométrie - comment dessiner les observations ? + geom_point()

Voici l'anatomie, morceau par morceau :

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point()
  • ggplot(mtcars, ...) démarre un graphique dont les données par défaut sont mtcars. Seul, il dessine un panneau gris vide - pas encore de couches.
  • aes(x = wt, y = hp) est la correspondance esthétique : la position horizontale vient de la colonne wt, la verticale de hp. Note que tu écris des noms de colonnes nus, pas mtcars$wt - la correspondance est évaluée dans les données que tu as fournies.
  • + geom_point() ajoute une couche qui dessine chaque ligne sous forme de point. Le + est vraiment une addition de couches : le graphique est un objet que tu construis, et tu peux continuer d'ajouter - un autre geom, des étiquettes, un thème - chacun avec un + de plus.

Exécute-le et tu obtiens le même nuage poids-puissance que la version R de base du guide du nuage de points, sur un panneau gris avec des lignes de grille blanches. Remplace geom_point() par geom_line() et la même correspondance devient une courbe - c'est la grammaire qui fait son travail.

Les geoms que tu utiliseras vraiment

Une douzaine de geoms couvrent presque tout le travail quotidien :

geom_point()       # scatter plot: two numeric variables
geom_line()        # line chart: trends over an ordered variable
geom_col()         # bar chart from pre-computed heights (needs y)
geom_bar()         # bar chart that counts raw rows for you (no y)
geom_histogram()   # distribution of one numeric variable (set binwidth)
geom_boxplot()     # distributions compared across groups
geom_smooth()      # fitted trend line; method = "lm" for straight

Les couches s'empilent, et c'est là que ggplot2 commence à battre R de base en expressivité : geom_point() + geom_smooth(method = "lm") donne un nuage de points avec une droite de régression et une bande de confiance, en une ligne lisible. Comme les graphiques sont des objets, tu peux aussi enregistrer une base et en dériver des variantes :

p <- ggplot(mtcars, aes(x = wt, y = hp)) + geom_point()

p + geom_smooth(method = "lm")   # one variant
p + geom_smooth()                # another (loess curve)

Associer ou fixer : la confusion classique d'aes()

L'erreur que tout débutant en ggplot2 commet, généralement dès la première semaine : mettre une couleur littérale dans aes(). La règle est courte - dans aes() signifie « varie avec les données » ; en dehors signifie « réglage fixe » - et les deux emplacements font des choses complètement différentes :

# MAPPING: color varies by a column - each cylinder count gets its own
# color, and a legend appears automatically
ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2)

# SETTING: every point is literally steelblue - no legend, no mapping
ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2)

Et le piège lui-même :

# WRONG: "blue" inside aes() is treated as data, not as a color
ggplot(mtcars, aes(x = wt, y = hp, color = "blue")) +
    geom_point()

Ça dessine des points rose saumon avec une légende dont l'unique entrée est étiquetée « blue ». Pourquoi : aes() associe des colonnes à des propriétés, donc color = "blue" crée une fausse colonne à une seule catégorie dont la valeur est le mot « blue » partout, et ggplot attribue à cette catégorie sa première couleur par défaut - qui se trouve être un saumon rougeâtre. Si tu voulais dire « rends les points bleus », la couleur va en dehors de la correspondance : geom_point(color = "blue"). La même règle vaut pour size, shape, fill et alpha. (Note aussi le factor(cyl) de l'exemple de correspondance : cyl est numérique, et l'envelopper dans factor() demande des couleurs distinctes par groupe plutôt qu'un dégradé continu.)

Étiquettes, facettes et thèmes

labs() nomme tout au même endroit - et un graphique n'est pas fini tant qu'il n'a pas de vraies étiquettes :

ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2) +
    labs(title = "Horsepower vs. weight",
         x     = "Weight (1000 lbs)",
         y     = "Horsepower",
         color = "Cylinders")

Les facettes sont la fonctionnalité phare de ggplot2 : découper un graphique en petits multiples, un panneau par groupe, avec des axes partagés pour que les panneaux se comparent honnêtement :

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point() +
    facet_wrap(~ cyl)

Trois panneaux apparaissent - un pour les voitures à 4, 6 et 8 cylindres - disposés en grille avec la valeur du groupe en légende au-dessus de chaque panneau. En R de base, c'est un numéro de jonglage avec par(mfrow) et des limites partagées réglées à la main ; ici c'est une ligne. Le facettage récompense les données bien rangées, ce qui explique pourquoi ggplot2 se marie si naturellement avec un pipeline dplyr - filtre et résume, puis envoie le résultat directement dans ggplot().

Les thèmes restylisent l'encre non liée aux données en un appel : + theme_minimal() (fond blanc épuré), + theme_bw(), + theme_classic() (axes seuls, pas de grille), ou le gris par défaut. Choisis-en un par projet et reste cohérent - un rapport où chaque figure partage un thème se lit comme un document unique plutôt que comme un album de découpes.

Enregistrer avec ggsave() - et quand R de base suffit encore

ggsave() écrit le graphique le plus récent sur le disque, en déduisant le format de l'extension du fichier :

ggsave("hp-vs-weight.png", width = 8, height = 5)          # last plot shown
ggsave("hp-vs-weight.pdf", plot = p, width = 8, height = 5) # a saved object

width et height sont en pouces par défaut ; fixe-les explicitement, parce que les tailles de police évoluent avec les dimensions de sortie et que les valeurs par défaut correspondent rarement à la destination de la figure.

Quant à savoir quand s'embêter : pour un coup d'œil de cinq secondes sur une variable en cours d'analyse, plot() et compagnie en R de base demandent moins de frappe et zéro dépendance - il n'y a pas de prix pour utiliser ggplot2 partout. ggplot2 gagne sa place dès qu'une figure implique des groupes, des légendes, des facettes ou un public : la grammaire passe à une complexité que le tracé de base ne gère qu'au prix d'efforts.

Ce que tu retiens

  • ggplot2 compose chaque graphique à partir de données + correspondance aes() + couches geom, reliées par + ; apprends la grammaire une fois, réutilise-la pour chaque type de graphique.
  • aes() associe des colonnes à des propriétés visuelles - des noms de colonnes nus, évalués dans ton data frame.
  • Dans aes() = varie avec les données (et obtient une légende) ; en dehors = réglage fixe. aes(color = "blue") est le bug classique.
  • labs() pour les titres, facet_wrap(~ group) pour les petits multiples, theme_minimal() et compagnie pour le style, ggsave() avec des dimensions explicites pour exporter.
  • Coup d'œil rapide en solo : R de base. Groupes, facettes ou public : ggplot2.

Cela clôt le chapitre graphique - à partir d'ici, l'étape naturelle suivante est les statistiques descriptives, qui mettent des nombres sur les formes que ces graphiques révèlent.

Questions fréquentes

Qu'est-ce que ggplot2 en R ?

ggplot2 est le package graphique le plus populaire de R. Au lieu d'une fonction par type de graphique, tu composes chaque graphique à partir des trois mêmes pièces - un data frame, une correspondance aes() des colonnes vers des propriétés visuelles, et une ou plusieurs couches geom_*() - reliées par +. Il fait partie du tidyverse.

Comment installer ggplot2 ?

Lance install.packages("ggplot2") une fois, puis library(ggplot2) en tête de chaque script qui l'utilise. L'installation met le package sur ta machine ; library() le charge dans la session courante.

Que fait aes() dans ggplot2 ?

aes() associe des colonnes de tes données à des propriétés visuelles : aes(x = wt, y = hp, color = factor(cyl)) dit que la position horizontale vient de wt, la verticale de hp, et la couleur des points du nombre de cylindres. Tout ce qui est dans aes() varie avec les données ; tout ce qui est en dehors est un réglage fixe.

Pourquoi mes points ggplot n'ont-ils pas la couleur demandée ?

Tu as mis la couleur dans aes() : aes(color = "blue") ne fixe pas une couleur, il associe une catégorie inventée nommée « blue », donc ggplot choisit sa propre couleur par défaut et ajoute une légende. Pour fixer une couleur littérale, mets-la en dehors de la correspondance : geom_point(color = "blue").

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER