Ajouter du texte et des annotations dans ggplot2

Étiqueter des points et annoter un graphique ggplot2 — en direct dans votre navigateur

Apprenez à ajouter du texte à un graphique ggplot2 en R — étiquetez les points avec geom_text() et geom_label(), placez une annotation fixe avec annotate(), contrôlez la taille, la police et la justification, décalez les étiquettes de leurs points et repoussez les chevauchements avec ggrepel. Modifiez et exécutez le code en direct, sans installation.

Date de publication

20 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Ajoutez du texte issu de vos données avec geom_text() — associez une colonne à aes(label = ...) pour que chaque ligne reçoive sa propre étiquette.
  • geom_label() dessine le même texte à l’intérieur d’une boîte arrondie, pour le faire ressortir sur un arrière-plan chargé.
  • Placez une note fixe unique à des coordonnées choisies avec annotate("text", x = , y = , label = ) — elle ne dépend jamais des données.
  • Mettez le texte en forme avec size, fontface ("bold", "italic") et family ; positionnez-le avec hjust/vjust.
  • Décalez les étiquettes de leurs points avec nudge_x/nudge_y, et désencombrez avec check_overlap = TRUE.
  • Quand les étiquettes se chevauchent encore, ggrepel (geom_text_repel()) les écarte à l’aide de lignes de rappel.
  • Chaque graphique ci-dessous est rendu pour vous — modifiez ensuite n’importe quel exemple en direct dans le bac à sable.
Obtenez le livre — GGPlot2 Essentials (PDF)

Introduction

Une fois un graphique ggplot2 dessiné, la question suivante est presque toujours : « comment écrire dessus ? » — étiqueter les points, mettre en évidence une valeur précise ou ajouter une note d’en-tête. En R, ggplot2 vous offre deux couches de texte — geom_text() et geom_label() pour les étiquettes pilotées par les données, et annotate() pour une note fixe et ponctuelle — ainsi que les réglages pour les dimensionner, les styliser, les justifier et les décaler. Cette leçon construit chacun pas à pas ; les figures sont rendues ici même, et vous pouvez réexécuter ou modifier chacune d’elles en direct.

Nous utilisons le jeu de données intégré mtcars : consommation et conception de 32 voitures d’un magazine de 1974. Nous associons le poids (wt, en milliers de livres) à l’axe des x et la consommation (mpg, miles par gallon) à l’axe des y, et nous utilisons les noms des voitures (les noms de lignes) comme étiquettes.

Étiqueter des points avec geom_text()

geom_text() écrit un texte par ligne. Associez la colonne que vous voulez afficher à aes(label = ...) — ici les noms des voitures, qui se trouvent dans les noms de lignes, donc nous les extrayons d’abord dans une vraie colonne (chaque bloc est autonome, il recrée donc cette colonne lui-même).

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name)) +
  geom_point(colour = "#3a86d4") +
  geom_text(colour = "#3a86d4", size = 3) +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with each point labelled by its car name in azure text.

Étiquettes encadrées avec geom_label()

geom_label() dessine le même texte à l’intérieur d’un rectangle arrondi. La boîte donne au texte un fond plein, de sorte que les étiquettes restent lisibles même lorsqu’elles se posent sur des points ou des lignes de la grille.

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name)) +
  geom_point(colour = "#3a86d4") +
  geom_label(size = 2.6, fill = "white") +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with each point labelled in a small rounded box.

Une annotation fixe avec annotate()

Pour ajouter une note unique — une légende, une mise en évidence, une étiquette pour une région — utilisez annotate(). Elle n’est pas liée aux données : vous lui donnez le geom ("text"), les coordonnées et la chaîne de caractères. C’est la façon la plus propre d’écrire un seul texte sans créer un data frame d’une seule ligne.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(colour = "#3a86d4") +
  annotate("text", x = 4.5, y = 30, label = "Light cars\ngo further",
           colour = "grey30", size = 4) +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with a single fixed text note placed in the upper-right area.

Une étiquette unique avec geom_text()

Vous pouvez aussi placer une étiquette fixe unique avec geom_text() en passant directement x, y et label (en dehors de aes()). annotate() est généralement plus net pour cela, mais geom_text() fonctionne de la même façon et est pratique lorsque vous avez déjà la couche sous la main.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(colour = "#3a86d4") +
  geom_text(x = 3, y = 33, label = "32 cars, 1974", colour = "grey30", size = 4) +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with one fixed text label drawn at a chosen coordinate.

Contrôler la taille du texte

Définissez size pour agrandir ou réduire les étiquettes. C’est une constante (en millimètres), passée en dehors d’aes(), donc elle s’applique de la même façon à chaque étiquette. Optez pour une petite taille quand vous avez beaucoup de points.

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name)) +
  geom_point(colour = "#3a86d4") +
  geom_text(size = 4.5, colour = "#3a86d4") +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with larger point labels set by a constant text size.

Justifier et positionner le texte — hjust, vjust

hjust contrôle l’alignement horizontal (0 = gauche, 0.5 = centre, 1 = droite) et vjust l’alignement vertical (0 = bas, 1 = haut). Ils repositionnent le texte par rapport à son point d’ancrage — définissez hjust = 0 pour pousser chaque étiquette à droite de son point afin que le marqueur reste visible.

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name)) +
  geom_point(colour = "#3a86d4") +
  geom_text(aes(hjust = 0, vjust = 0), size = 3, colour = "grey30") +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot with point labels left-justified so each name sits to the right of its marker.

Style et famille de police

fontface met en forme le texte — "plain", "bold", "italic" ou "bold.italic" — et family choisit la police (par exemple "serif", "sans", "mono"). Utilisez-les pour distinguer une annotation des étiquettes de données.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(colour = "#3a86d4") +
  annotate("text", x = 4, y = 28, label = "Heavier = thirstier",
           fontface = "bold.italic", family = "serif", size = 5, colour = "grey30") +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with a bold italic serif annotation placed on the plot.

Décaler les étiquettes de leurs points

Quand une étiquette se pose juste sur son marqueur, décalez-la avec nudge_x / nudge_y (une fine surcouche autour de position_nudge()). Un petit décalage vers le haut dégage chaque nom de son point sans déplacer les points eux-mêmes.

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name)) +
  geom_point(colour = "#3a86d4") +
  geom_text(nudge_y = 0.6, size = 3, colour = "grey30") +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage with each label nudged upward so it clears its point.

Masquer les étiquettes qui se chevauchent avec check_overlap

Avec 32 noms, les étiquettes se chevauchent. check_overlap = TRUE est la solution la plus rapide intégrée à ggplot2 : elle dessine les étiquettes dans l’ordre et ignore toute étiquette qui en chevaucherait une déjà placée. Vous gardez les étiquettes lisibles et perdez l’encombrement — sans aucun paquet supplémentaire.

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name)) +
  geom_point(colour = "#3a86d4") +
  geom_text(check_overlap = TRUE, nudge_y = 0.5, size = 3, colour = "grey30") +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  theme_minimal()

ggplot2 scatter plot of car weight versus mileage where overlapping labels are dropped, leaving a clean set.

Colorer les étiquettes par groupe

Associez une variable de regroupement à aes(colour = ...) pour colorer le texte par catégorie. Utilisez une palette adaptée au daltonisme comme viridis (scale_colour_viridis_d()) afin que la figure soit lisible par tous, en couleur ou à l’impression. Ici, nous colorons chaque nom de voiture selon son nombre de cylindres. (Pour savoir où placer — ou comment masquer — la légende qui en résulte, consultez le guide des légendes ggplot2.)

library(ggplot2)
cars <- mtcars
cars$name <- rownames(mtcars)
ggplot(cars, aes(x = wt, y = mpg, label = name, colour = factor(cyl))) +
  geom_point() +
  geom_text(check_overlap = TRUE, nudge_y = 0.6, size = 3) +
  scale_colour_viridis_d() +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon", colour = "Cylinders") +
  theme_minimal()

ggplot2 scatter plot with car-name labels coloured by cylinder count using a colourblind-safe viridis palette.

Pour aller plus loin : repousser les chevauchements avec ggrepel

check_overlap supprime les étiquettes qui se chevauchent ; quand vous voulez toutes les garder et les déplacer à la place, le paquet compagnon ggrepel ajoute geom_text_repel() et geom_label_repel(), qui écartent les étiquettes à l’aide de fines lignes de rappel jusqu’à chaque point — la méthode standard pour étiqueter chaque point d’un nuage de points dense. Installez-le avec install.packages("ggrepel") ; les outils d’annotation de cette leçon relèvent tous de ggplot2 de base.

Essayez en direct

Les graphiques ci-dessus ont été rendus au moment de la construction. Envie d’expérimenter ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (sans serveur, sans installation).

Vous travaillez en Python ? Un guide matplotlib sur le texte et les annotations arrive dans la série Python.

🟢 Avec un agent IA

Demandez à Prova « comment étiqueter uniquement les voitures dont le mpg dépasse 25 dans ce graphique ? » — elle répond avec du code que vous pouvez exécuter, de sorte que l’explication est reproductible. The runtime is the judge. Ask Prova →

Questions fréquentes

geom_text() est piloté par les données : il dessine une étiquette par ligne, vous associez donc une colonne à aes(label = ...). annotate("text", ...) ajoute une note fixe et unique aux coordonnées que vous indiquez et ignore complètement les données — utilisez-le pour une légende ou une mise en évidence ponctuelle plutôt que de construire un data frame d’une seule ligne.

Utilisez geom_label() au lieu de geom_text() — il dessine le même texte à l’intérieur d’un rectangle arrondi. Définissez fill = "white" pour donner au texte un fond plein afin qu’il reste lisible par-dessus les points et les lignes de la grille.

Avec beaucoup de points, les étiquettes se chevauchent. La solution intégrée est geom_text(check_overlap = TRUE), qui dessine les étiquettes dans l’ordre et ignore toute étiquette qui en chevaucherait une déjà placée. Pour garder toutes les étiquettes et les écarter à la place, utilisez geom_text_repel() du paquet ggrepel.

Ajoutez nudge_x et/ou nudge_y à geom_text() — par exemple geom_text(nudge_y = 0.6) dégage chaque étiquette de son marqueur sans déplacer les points. Vous pouvez aussi réaligner par rapport au point d’ancrage avec hjust (0 = gauche, 1 = droite) et vjust (0 = bas, 1 = haut).

Définissez size (une constante en millimètres, passée en dehors d’aes()) pour dimensionner toutes les étiquettes de la même façon. Utilisez fontface pour le style ("bold", "italic", "bold.italic") et family pour la police ("serif", "sans", "mono").

Testez vos connaissances

Complétez le code pour qu’une note unique affichant « Most efficient » apparaisse en haut à gauche du graphique, en x = 2, y = 33.

# Use annotate("text", x = , y = , label = ) — the geom is "text"
library(ggplot2) ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point(colour = "#3a86d4") + annotate("text", x = 2, y = 33, label = "Most efficient") + theme_minimal()
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(colour = "#3a86d4") +
  annotate("text", x = 2, y = 33, label = "Most efficient") +
  theme_minimal()

Conclusion

Vous avez ajouté du texte à un graphique ggplot2 à partir de vos données avec geom_text() et geom_label(), placé une note fixe avec annotate(), contrôlé la taille, la police et la justification, décalé les étiquettes de leurs points, désencombré avec check_overlap, coloré les étiquettes par groupe avec une palette adaptée au daltonisme, et repoussé les chevauchements avec ggrepel. Pour définir le titre, le sous-titre et les libellés d’axes du graphique (un autre type de « texte »), consultez titres, sous-titres et légendes ; pour le type de graphique lui-même, commencez par le nuage de points.

Leçons connexes

Vous préférez un livre ? GGPlot2 Essentials est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série ggplot2 — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Cette leçon est reproductible : les figures sont exécutées au moment de la construction (si elles s’affichent, le code fonctionne), et le bac à sable et le quiz se réexécutent en direct dans votre navigateur. The runtime is the judge.

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Ajouter du texte et des annotations dans ggplot2},
  date = {2026-06-20},
  url = {https://www.datanovia.com/learn/data-visualization/ggplot2/text-annotations},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Ajouter du texte et des annotations dans ggplot2.” 2026. June 20. https://www.datanovia.com/learn/data-visualization/ggplot2/text-annotations.