Graphique de densité en R : guide ggplot2

Tracez, colorez et groupez un graphique de densité ggplot2 — en direct dans votre navigateur

Apprenez à construire un graphique de densité en R avec ggplot2 — tracez la distribution d’une variable continue avec geom_density(), ajoutez une ligne de moyenne, colorez la courbe ou remplissez l’aire par groupe, et superposez un histogramme. Modifiez et exécutez le code en direct, sans installation.

Date de publication

20 juin 2026

Modifié

8 juillet 2026

AstucePoints clés
  • Un graphique de densité est une version lissée d’un histogramme — il montre la forme de la distribution d’une variable continue sous la forme d’une seule courbe continue.
  • Dans ggplot2, vous associez la variable à x et tracez la courbe avec geom_density().
  • L’axe des y est une densité (aire sous la courbe = 1) par défaut ; passez aux effectifs avec aes(y = after_stat(count)).
  • Marquez le centre en ajoutant une ligne verticale à la moyenne avec geom_vline().
  • Colorez la courbe par groupe avec colour = group, ou remplissez l’aire avec fill = group plus un alpha semi-transparent pour que les groupes qui se chevauchent restent lisibles.
  • Utilisez une palette adaptée au daltonisme (scale_colour_viridis_d() / scale_fill_viridis_d()) pour les groupes.
  • Superposez une courbe de densité sur un histogramme en plaçant l’histogramme sur l’échelle des y de la densité (aes(y = after_stat(density))).
  • 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

Un graphique de densité est le moyen le plus rapide de voir la forme d’une variable continue : où se situe son pic, si elle est asymétrique et si elle possède plus d’un mode — le tout à partir d’une seule courbe lisse. En R, ggplot2 en trace un avec une seule couche — geom_density() — et facilite l’ajout d’une ligne de moyenne, la coloration par groupe et la superposition d’un histogramme. Cette leçon en construit un étape par étape ; les figures sont rendues ici même, et vous pouvez réexécuter ou modifier chacune d’elles en direct.

Nous utilisons deux jeux de données intégrés. Pour les exemples à une seule série, faithful (temps d’attente entre les éruptions du geyser Old Faithful) — sa variable waiting présente une forme nette à deux pics (bimodale) que la courbe de densité met bien en valeur. Pour les exemples groupés, iris — en comparant Sepal.Length entre les trois espèces de fleurs, dont les distributions se séparent nettement.

Graphique de densité de base avec geom_density()

Associez la variable continue à x et ajoutez une seule couche de densité. ggplot2 estime une courbe de densité lisse à partir des données — aucune décision de regroupement, contrairement à un histogramme.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  geom_density(fill = "#3a86d4", alpha = 0.7) +
  labs(x = "Waiting time (min)", y = "Density") +
  theme_minimal()

ggplot2 density plot of Old Faithful waiting times, a smooth curve with two clear peaks.

Ajouter une ligne verticale de moyenne

La courbe montre la forme ; une ligne verticale à la moyenne marque le centre. Ajoutez-la avec geom_vline(), en calculant la moyenne à partir des données.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  geom_density(fill = "#3a86d4", alpha = 0.7) +
  geom_vline(xintercept = mean(faithful$waiting),
             colour = "grey30", linetype = "dashed", linewidth = 1) +
  labs(x = "Waiting time (min)", y = "Density") +
  theme_minimal()

ggplot2 density plot of waiting times with a dashed vertical line marking the mean.

Pour des données groupées, vous voulez une ligne par groupe. Résumez d’abord les moyennes par groupe avec la fonction aggregate() de base R, puis passez-les à geom_vline() afin que chaque ligne soit colorée pour correspondre à son groupe.

library(ggplot2)
mu <- aggregate(Sepal.Length ~ Species, data = iris, FUN = mean)
ggplot(iris, aes(x = Sepal.Length, colour = Species)) +
  geom_density() +
  geom_vline(data = mu, aes(xintercept = Sepal.Length, colour = Species),
             linetype = "dashed") +
  scale_colour_viridis_d() +
  labs(x = "Sepal length (cm)", y = "Density", colour = "Species") +
  theme_minimal()

ggplot2 density plot of sepal length by iris species with a dashed vertical line at each species' mean, coloured to match.

Densité vs effectif sur l’axe des y

Par défaut, l’axe des y est une densité (l’aire sous la courbe vaut 1), ce qui rend comparables des groupes de tailles différentes. Si vous préférez lire des effectifs, associez y à after_stat(count) — cela met la courbe à l’échelle du nombre d’observations.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  geom_density(aes(y = after_stat(count)), fill = "#3a86d4", alpha = 0.7) +
  labs(x = "Waiting time (min)", y = "Count") +
  theme_minimal()

ggplot2 density plot of waiting times with the y-axis showing counts instead of density.

Apparence à une seule série : courbe, remplissage, alpha, linetype

Deux attributs esthétiques contrôlent l’apparence de la courbe : colour est le contour, fill l’aire en dessous. Adoucissez un remplissage qui se chevauche avec alpha (semi-transparent), et passez le contour à un linetype en tirets lorsque vous voulez que l’aire se lise comme l’élément principal.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  geom_density(colour = "grey30", fill = "#3a86d4",
               alpha = 0.4, linetype = "dashed", linewidth = 1) +
  labs(x = "Waiting time (min)", y = "Density") +
  theme_minimal()

ggplot2 density plot of waiting times with a dark dashed outline and a soft semi-transparent azure fill.

Colorer la courbe de densité par groupe

Pour comparer des groupes, associez la variable de groupement à colour. ggplot2 trace une courbe par groupe et ajoute automatiquement une légende. Utilisez une palette adaptée au daltonisme comme viridis pour que la figure reste lisible pour tous, en couleur comme à l’impression.

library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, colour = Species)) +
  geom_density(linewidth = 1) +
  scale_colour_viridis_d() +
  labs(x = "Sepal length (cm)", y = "Density", colour = "Species") +
  theme_minimal()

ggplot2 density plot with one curve per iris species, the outlines coloured with a colourblind-safe viridis palette.

Remplir l’aire de densité par groupe

Associer le groupe à fill peint l’aire sous chaque courbe. Comme les courbes se chevauchent, définissez un alpha semi-transparent pour que les deux groupes restent visibles là où ils se croisent.

library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.5) +
  scale_fill_viridis_d() +
  labs(x = "Sepal length (cm)", y = "Density", fill = "Species") +
  theme_minimal()

ggplot2 density plot with the area under each iris species' curve filled with a semi-transparent viridis colour, overlapping where they cross.

Combiner un histogramme et une superposition de densité

Un histogramme montre les effectifs bruts regroupés ; une courbe de densité les lisse. Placez les deux sur la même figure en traçant l’histogramme sur l’échelle des y de la densité (aes(y = after_stat(density))) afin que la courbe se superpose par-dessus.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30, fill = "grey80", colour = "white") +
  geom_density(colour = "#3a86d4", linewidth = 1) +
  labs(x = "Waiting time (min)", y = "Density") +
  theme_minimal()

ggplot2 histogram of waiting times with a smooth density curve overlaid on the same density y-scale.

La même superposition fonctionne par groupe — un histogramme translucide derrière la courbe de chaque groupe :

library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, fill = Species, colour = Species)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 30, alpha = 0.3, position = "identity") +
  geom_density(alpha = 0, linewidth = 1) +
  scale_fill_viridis_d() +
  scale_colour_viridis_d() +
  labs(x = "Sepal length (cm)", y = "Density", fill = "Species", colour = "Species") +
  theme_minimal()

ggplot2 grouped histogram and density overlay of sepal length by iris species, each group on the density y-scale with translucent bars and a curve.

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 de densité (KDE) seaborn/matplotlib arrive bientôt dans la série Python.

🟢 Avec un agent IA

Demandez à Prova « la forme à deux pics de ce graphique de densité est-elle réelle, ou juste un artefact de lissage dû à la largeur de bande ? » — 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

Associez votre variable continue à x et ajoutez une seule couche geom_density(), par exemple ggplot(faithful, aes(x = waiting)) + geom_density(). ggplot2 estime la courbe lisse pour vous — aucun choix de regroupement, contrairement à un histogramme.

Par défaut, geom_density() place la densité sur l’axe des y, de sorte que l’aire sous la courbe vaut 1 et que des groupes de tailles différentes restent comparables. Pour lire plutôt des effectifs, associez y à after_stat(count) avec geom_density(aes(y = after_stat(count))), ce qui met la courbe à l’échelle du nombre d’observations.

Ajoutez geom_vline() avec xintercept = mean(faithful$waiting), plus linetype = "dashed" pour la distinguer de la courbe. Pour des données groupées, calculez d’abord les moyennes par groupe avec aggregate(Sepal.Length ~ Species, data = iris, FUN = mean) et passez ce data frame à geom_vline() afin que chaque ligne corresponde à la couleur de son groupe.

Associez la variable de groupement à colour (aes(x = Sepal.Length, colour = Species)) pour tracer une courbe avec contour par groupe, ou à fill pour peindre l’aire sous chacune. ggplot2 ajoute automatiquement la légende ; utilisez scale_colour_viridis_d() ou scale_fill_viridis_d() pour une palette adaptée au daltonisme.

Lorsque vous associez un groupe à fill, les aires remplies sont opaques par défaut et le groupe au premier plan recouvre les autres. Définissez un alpha semi-transparent tel que geom_density(alpha = 0.5) pour que chaque groupe reste visible là où les courbes se croisent.

Testez vos connaissances

Complétez le code pour que l’aire de densité de chaque espèce soit remplie et semi-transparente, avec une palette adaptée au daltonisme.

# Pass alpha = 0.5 to geom_density(), then add scale_fill_viridis_d()
library(ggplot2) ggplot(iris, aes(x = Sepal.Length, fill = Species)) + geom_density(alpha = 0.5) + scale_fill_viridis_d()
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.5) +
  scale_fill_viridis_d()

Conclusion

Vous avez construit un graphique de densité ggplot2, marqué la moyenne avec une ligne verticale (à une seule série et par groupe), basculé l’axe des y entre densité et effectif, stylisé la courbe et son remplissage, coloré et rempli par groupe avec une palette adaptée au daltonisme, et superposé une courbe de densité sur un histogramme. Ensuite, explorez l’histogramme pour les effectifs regroupés, la boîte à moustaches pour un résumé compact de la même distribution, et le reste de la grammaire ggplot2.

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 = {Graphique de densité en R : guide ggplot2},
  date = {2026-06-20},
  url = {https://www.datanovia.com/learn/data-visualization/ggplot2/density-plot},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Graphique de densité en R : guide ggplot2.” 2026. June 20. https://www.datanovia.com/learn/data-visualization/ggplot2/density-plot.