Comment personnaliser un graphique ggplot2 dans R : titres, axes, couleurs, légende et thème

Un seul parcours qui fait passer un graphique du strict minimum par défaut au prêt à publier

Faites passer un graphique ggplot2 du strict minimum par défaut au prêt à publier dans R, en un seul flux — ajoutez un titre et des titres d’axe, définissez les limites et les graduations des axes, changez les couleurs, repositionnez la légende et changez de thème. Chaque étape renvoie à la leçon dédiée pour aller plus loin.

Date de publication

17 juillet 2026

Modifié

17 juillet 2026

AstucePoints clés
  • La personnalisation dans ggplot2 se fait par couches : vous ajoutez labs(), un scale_*(), un theme(), puis vous changez de thème — chacun affine le même graphique.
  • labs() définit le titre, le sous-titre, les titres des axes, la légende de figure et le titre de la légende en un seul appel.
  • Contrôlez les axes avec scale_x_continuous() / scale_y_continuous() (limites, graduations) ou coord_cartesian() (zoom sans supprimer de données).
  • Associez une variable à colour et choisissez une échelle adaptée au daltonisme comme scale_color_viridis_d() ; déplacez ou masquez la légende avec theme(legend.position = ...).
  • Remplacez le gris par défaut par theme_minimal() ou theme_classic(), puis affinez avec theme().
  • Cette leçon est l’aboutissement : un seul graphique, du défaut au prêt à publier — chaque étape renvoie à la leçon dédiée pour approfondir.
Obtenez le livre — GGPlot2 Essentials (PDF)

Introduction

La plupart des questions sur ggplot2 se résument à une seule : comment donner la bonne apparence à ce graphique ? Le graphique par défaut répond à l’analyse, mais pas au public — fond gris, noms de colonnes bruts en guise de titres d’axe, aucun titre, une légende là où ggplot2 le décide. La personnalisation corrige tout cela, et elle se fait par couches : vous ajoutez sans cesse de petits éléments (labs(), une échelle, un thème) au même graphique jusqu’à ce qu’il soit prêt à publier.

C’est l’aboutissement de la série ggplot2. Au lieu de ré-enseigner chaque sujet en profondeur, nous prenons un seul graphique et le faisons passer du strict minimum par défaut au prêt à publier en un seul flux, en touchant à chaque couche de personnalisation une fois. À chaque étape, vous obtenez la recette rapide, et un lien vers la leçon dédiée lorsque vous voulez le traitement complet.

Nous utilisons le jeu de données intégré mtcars : le poids de la voiture (wt) en fonction des miles par gallon (mpg), coloré selon le nombre de cylindres (cyl).

Étape 1 — le strict minimum par défaut

Commencez par le minimum : associez wt et mpg, ajoutez des points. Cela fonctionne, mais ce n’est pas présentable.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point()

A default ggplot2 scatter plot of car weight versus miles per gallon on a grey background, with lowercase column names as axis titles and no plot title.

Trois choses paraissent inachevées : le fond gris avec ses lignes de grille marquées, les titres des axes qui sont des noms de colonnes bruts (wt, mpg) au lieu de mots, et l’absence de titre indiquant au lecteur ce qu’il regarde. Nous corrigeons chacune à son tour.

Étape 2 — titres et titres d’axe

labs() définit chaque étiquette de texte en un seul appel : title, subtitle, les titres d’axe x/y, et une caption pour la source des données.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  labs(
    title    = "Heavier cars use more fuel",
    subtitle = "Weight vs. fuel economy for 32 cars",
    x        = "Weight (1000 lbs)",
    y        = "Miles per gallon",
    caption  = "Source: 1974 Motor Trend, mtcars"
  )

The same scatter plot with a title, subtitle, readable axis labels, and a source caption added.

Le graphique s’explique désormais de lui-même. Pour l’ensemble complet des options — styliser le titre, ajouter un tag, utiliser \n pour les sauts de ligne — consultez les leçons dédiées sur le titre, le sous-titre et la légende de figure et sur la modification des titres d’axe.

Étape 3 — les axes : limites, graduations et zoom

Les plages d’axe et les positions des graduations sont contrôlées par scale_x_continuous() et scale_y_continuous(). Définissez limits pour fixer la plage et breaks pour choisir les marques de graduation.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon") +
  scale_x_continuous(breaks = seq(1, 6, by = 1)) +
  scale_y_continuous(limits = c(10, 35), breaks = seq(10, 35, by = 5))

The scatter plot with the y-axis fixed from 10 to 35 and tick marks every 5 units, and x-axis ticks every 1 unit.

Une mise en garde : scale_y_continuous(limits = ...) supprime tout point hors de la plage avant le tracé, ce qui peut modifier une droite ajustée. Pour zoomer sans écarter de données, utilisez plutôt coord_cartesian(ylim = ...). Pour le traitement complet — échelles logarithmiques, inversion d’un axe, expansion — consultez les limites et échelles d’axe, et pour la stylisation des graduations, consultez les graduations d’axe.

Étape 4 — la couleur : associer une variable, choisir une bonne échelle

Pour colorer les points par groupe, associez la variable de regroupement à colour à l’intérieur de aes(). Enveloppez le cyl numérique dans factor() pour que ggplot2 le traite comme des catégories discrètes, puis appliquez une échelle adaptée au daltonisme avec scale_color_viridis_d().

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon", color = "Cylinders") +
  scale_color_viridis_d()

The scatter plot with points coloured by cylinder count using a colourblind-safe viridis palette, with a legend on the right.

Pour un graphique à série unique sans regroupement, définissez plutôt une seule couleur fixe — geom_point(color = "#3a86d4"), l’azur de la marque Datanovia. La boîte à outils complète des palettes — couleurs manuelles, brewer, gradients pour les variables continues — se trouve dans la leçon sur les couleurs.

Étape 5 — la légende : repositionner, renommer ou supprimer

L’association de colour a créé une légende automatiquement. Déplacez-la avec theme(legend.position = ...) ("top", "bottom", "left", "right", ou "none" pour la supprimer), et définissez son titre via l’argument labs() correspondant (color = "Cylinders", déjà défini ci-dessus).

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(x = "Weight (1000 lbs)", y = "Miles per gallon", color = "Cylinders") +
  scale_color_viridis_d() +
  theme(legend.position = "top")

The coloured scatter plot with the legend moved to the top of the plot.

Pour supprimer entièrement la légende, utilisez legend.position = "none" ; pour un contrôle plus fin d’une légende parmi plusieurs, utilisez guides(). Consultez la leçon sur la légende pour l’ensemble complet des options.

Étape 6 — le thème : changer toute l’apparence

Le gris par défaut est theme_grey(). Remplacez-le par theme_minimal() (fond blanc, lignes de grille légères) ou theme_classic() (lignes d’axe, sans grille), puis affinez les détails avec theme() — ici, un texte de titre plus grand et en gras.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(title = "Heavier cars use more fuel", x = "Weight (1000 lbs)",
       y = "Miles per gallon", color = "Cylinders") +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(plot.title = element_text(size = 14, face = "bold"))

The scatter plot on a clean minimal theme with a white background and a larger bold title.

L’ordre compte : un thème complet comme theme_minimal() réinitialise tout, il doit donc venir avant tout ajustement de theme() — sinon le thème écrase vos modifications. Le catalogue complet des thèmes intégrés et la manière de créer le vôtre se trouvent dans la leçon sur les thèmes.

Étape 7 — le graphique final, prêt à publier

Empilez maintenant chaque couche sur le même graphique : étiquettes, axes personnalisés, une échelle adaptée au daltonisme, une légende repositionnée et un thème épuré. C’est la récompense — comparez-le à l’étape 1.

library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 3, alpha = 0.9) +
  labs(
    title    = "Heavier cars use more fuel",
    subtitle = "Weight vs. fuel economy for 32 cars",
    x        = "Weight (1000 lbs)",
    y        = "Miles per gallon",
    color    = "Cylinders",
    caption  = "Source: 1974 Motor Trend, mtcars"
  ) +
  scale_x_continuous(breaks = seq(1, 6, by = 1)) +
  scale_y_continuous(limits = c(10, 35), breaks = seq(10, 35, by = 5)) +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(
    legend.position = "top",
    plot.title      = element_text(size = 14, face = "bold"),
    plot.caption    = element_text(color = "grey40")
  )

A publication-ready scatter plot of weight versus miles per gallon, coloured by cylinder count with a viridis palette, a title and subtitle, readable axes, a legend on top, and a clean minimal theme.

Mêmes données, mêmes trois lignes de code de tracé de base — mais chaque couche de personnalisation ajoutée tour à tour le fait passer d’un défaut brut à une figure que vous pourriez insérer directement dans un rapport.

Aide-mémoire de personnalisation

Chaque besoin correspond à une fonction et à une leçon dédiée pour le traitement complet :

Ce que vous voulez changer Fonction(s) Leçon dédiée
Titre, sous-titre, légende de figure labs(title=, subtitle=, caption=) Titre, sous-titre et légende de figure
Titres des axes labs(x=, y=) Titres d’axe
Plage d’axe et positions des graduations scale_x_continuous(), coord_cartesian() Limites et échelles d’axe
Marques et texte des graduations scale_*_continuous(breaks=, labels=), theme() Graduations d’axe
Couleurs des points / groupes scale_color_*(), aes(color=) Couleurs
Position, titre, suppression de la légende theme(legend.position=), labs(), guides() Légende
Apparence globale (fond, grille) theme_minimal(), theme_classic(), theme() Thèmes
Découper en plusieurs panneaux facet_wrap(), facet_grid() Facettes
Forme et taille des points aes(shape=, size=), scale_shape_manual() Formes des points
Type et épaisseur de ligne aes(linetype=), scale_linetype_manual() Types de ligne
Étiquettes de texte sur le graphique geom_text(), annotate("text", …) Annotations de texte
Enregistrer ou exporter la figure ggsave("plot.png", width=, height=, dpi=) Enregistrer avec ggsave

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). Essayez de passer legend.position à "bottom", ou de remplacer theme_minimal() par theme_classic().

Vous travaillez en Python ? Un guide de stylisation matplotlib/seaborn arrive dans la série Python.

🟢 Avec un agent IA

Demandez à Prova « comment déplacer la légende ggplot2 sous le graphique et agrandir le titre ? » — elle répond avec du code que vous pouvez exécuter, donc la correction est reproductible. The runtime is the judge. Demander à Prova →

Problèmes fréquents

La légende ne bouge pas. Si theme(legend.position = "top") semble sans effet, vérifiez l’ordre : un thème complet tel que theme_minimal() réinitialise la position de la légende, il doit donc venir avant votre ajustement de theme(). ... + theme(legend.position = "top") + theme_minimal() revient silencieusement au défaut ; inversez les deux.

Une seconde échelle de couleur est ignorée. Ajouter scale_color_viridis_d() alors que vous avez déjà défini geom_point(color = "red") (une couleur fixe, hors de aes()) signifie que l’échelle n’a rien sur quoi agir — les échelles n’affectent que les attributs esthétiques associés. Si, à la place, vous ajoutez deux échelles de couleur, ggplot2 conserve la dernière et avertit « Scale for colour is already present ». Associez la variable dans aes() et appliquez exactement une seule échelle.

Les couleurs sortent en gradient, pas en groupes distincts. Associer une colonne numérique (color = cyl) donne une barre de couleur continue au lieu d’une légende discrète. Enveloppez-la dans factor() (color = factor(cyl)) pour que ggplot2 traite les valeurs comme des catégories, et utilisez une échelle discrète comme scale_color_viridis_d() (le _d signifie discret).

Questions fréquentes

La personnalisation se fait par couches : partez de ggplot(...) + geom_*(), puis ajoutez des éléments au même graphique — labs() pour les titres et les étiquettes, un scale_*() pour les couleurs et les axes, theme_minimal() (ou un autre thème) pour l’apparence globale, et theme() pour les ajustements fins. Chaque couche affine le graphique précédent au lieu de le remplacer.

Ajoutez un thème complet tel que theme_minimal() (fond blanc, grille légère) ou theme_classic() (lignes d’axe, sans grille). Pour un contrôle plus fin — couleur de fond, lignes de grille, taille du texte — ajoutez theme() après lui, par exemple theme_minimal() + theme(panel.background = element_rect(fill = "white")). Le thème complet doit venir en premier, sinon il réinitialise vos ajustements.

Utilisez theme(legend.position = ...) avec "top", "bottom", "left", "right", ou "none" pour la supprimer entièrement. Placez cet appel theme() après tout thème complet comme theme_minimal(), qui réinitialise la position.

Utilisez un seul appel labs() : labs(title = "My title", x = "X axis", y = "Y axis"). Il définit aussi subtitle, caption, et le titre de la légende (via le nom de l’attribut esthétique, par exemple color = "Group"). Les titres des axes prennent par défaut les noms des colonnes, donc labs() est généralement la première chose que vous ajoutez.

Pour une couleur unique, définissez-la à l’intérieur du geom, hors de aes() : geom_point(color = "#3a86d4"). Pour colorer par groupe, associez la variable — aes(color = factor(group)) — et ajoutez une échelle telle que scale_color_viridis_d() (adaptée au daltonisme) ou scale_color_manual(values = ...) pour des couleurs exactes.

Testez vos connaissances

Partez du nuage de points coloré ci-dessous. Ajoutez (1) un titre, (2) une échelle de couleur discrète adaptée au daltonisme, (3) un thème minimal épuré, et (4) la légende en bas.

# Chain four layers with +:
#   labs(title = "..."), scale_color_viridis_d(),
#   theme_minimal(), theme(legend.position = "bottom")
# Remember: theme_minimal() must come BEFORE theme(legend.position = ...).
library(ggplot2) ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) + geom_point(size = 3) + labs(title = "Heavier cars use more fuel", color = "Cylinders") + scale_color_viridis_d() + theme_minimal() + theme(legend.position = "bottom")
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(title = "Heavier cars use more fuel", color = "Cylinders") +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(legend.position = "bottom")

Vous écrivez theme(legend.position = "none") + theme_minimal() et la légende s’affiche toujours. Pourquoi ?

Afficher la réponse

Parce que theme_minimal() vient après votre appel theme() et réinitialise la position de la légende à sa valeur par défaut. Les thèmes complets écrasent tout, ils doivent donc venir en premier : theme_minimal() + theme(legend.position = "none").

Conclusion

Vous avez fait passer un seul graphique du strict minimum par défaut au prêt à publier, en ajoutant chaque couche de personnalisation tour à tour : les étiquettes avec labs(), les axes avec scale_*_continuous(), les couleurs avec scale_color_viridis_d(), la légende avec theme(legend.position = ...), et l’apparence avec theme_minimal(). Le principe est toujours le même — continuez d’ajouter des couches au même graphique jusqu’à ce qu’il se lise comme vous le souhaitez. Utilisez l’aide-mémoire ci-dessus pour aller directement à la fonction dont vous avez besoin.

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 = {Comment personnaliser un graphique ggplot2 dans R : titres,
    axes, couleurs, légende et thème},
  date = {2026-07-17},
  url = {https://www.datanovia.com/learn/data-visualization/ggplot2/customization},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Comment personnaliser un graphique ggplot2 dans R : titres, axes, couleurs, légende et thème.” 2026. July 17. https://www.datanovia.com/learn/data-visualization/ggplot2/customization.