set.seed(1234)
wdata <- data.frame(
sex = factor(rep(c("F", "M"), each = 200)),
weight = c(rnorm(200, mean = 55), rnorm(200, mean = 58))
)
head(wdata, 4) sex weight
1 F 53.79293
2 F 55.27743
3 F 56.08444
4 F 52.65430
Histogramme, densité, ECDF et diagramme en barres pour une seule variable
Visualisez la distribution d’une variable en R avec ggplot2 — histogramme, densité, histogramme+densité combinés, ECDF et un diagramme en barres pour des données discrètes. Ajoutez une ligne de moyenne et séparez par groupe.
27 juin 2026
7 juillet 2026
geom_histogram() répartit les valeurs en intervalles et les compte ; contrôlez les intervalles avec bins ou binwidth.geom_density() trace une courbe lisse ; combinez-la avec un histogramme en plaçant les deux sur l’échelle de densité via aes(y = after_stat(density)).stat_ecdf() trace la distribution cumulative empirique — la part des valeurs en dessous de chaque point.geom_bar() compte les niveaux d’une variable catégorielle.geom_vline(), et séparez n’importe lequel de ces graphiques par groupe avec fill/color.Pour représenter une seule variable, vous choisissez le graphique qui correspond à son type. Une variable continue (taille, poids, temps d’attente) a une forme — où sont ses regroupements, si elle est asymétrique ou bimodale — qui se voit le mieux avec un histogramme, une courbe de densité ou une ECDF. Une variable discrète (une catégorie, un comptage de groupes) a des fréquences — qui se voient le mieux avec un diagramme en barres.
Cette leçon les couvre toutes dans ggplot2, chacune rendue ici même, et vous oriente vers les leçons dédiées lorsque vous voulez approfondir un type de graphique.
Nous utilisons un data frame wdata construit — 400 poids séparés par sex — afin de pouvoir montrer à la fois une seule distribution et la même distribution séparée par groupe.
Un histogramme divise l’étendue en intervalles et compte les observations dans chacun. Associez la variable continue à x et ajoutez geom_histogram(). L’argument bins définit le nombre de barres ; binwidth définit plutôt leur largeur. Ici nous ajoutons aussi une ligne de moyenne en pointillés avec geom_vline().

Par défaut geom_histogram() utilise 30 intervalles, ce qui convient rarement à vos données — essayez bins = 20 ou binwidth = 0.5 et voyez lequel révèle la forme. Pour le traitement complet (mise en intervalles, histogrammes groupés, superpositions) voir la leçon dédiée sur l’histogramme.
Un graphique de densité est une estimation lisse de la distribution — utile lorsque la mise en intervalles paraît trop grossière. Utilisez geom_density() et, comme pour l’histogramme, ajoutez une ligne de moyenne.

La leçon sur le graphique de densité couvre en profondeur la largeur de bande, les remplissages et les courbes groupées.
Pour superposer les deux, placez l’histogramme sur l’échelle de densité afin que les deux couches partagent un axe des y. Associez y = after_stat(density) à l’intérieur du aes() de l’histogramme, puis ajoutez geom_density() par-dessus.

Sans after_stat(density) l’histogramme reste sur l’échelle des comptages et la courbe de densité (valeurs proches de 0) s’aplatit en une ligne invisible au bas — placer les deux sur l’échelle de densité est ce qui leur permet de partager le graphique.
L’ECDF indique, pour n’importe quelle valeur, la proportion d’observations inférieures ou égales à celle-ci. Elle ne nécessite aucune mise en intervalles et se lit directement en percentiles — la courbe franchit 0.5 à la médiane.

Lisez-la ainsi : remontez depuis un poids sur l’axe des x jusqu’à la courbe, puis horizontalement jusqu’à l’axe des y pour la part des valeurs en dessous de ce poids. La leçon sur l’ECDF va plus loin.
Un histogramme ou une courbe de densité suggère si les données sont normales, mais un graphique quantile-quantile (Q-Q plot) y répond directement en traçant les quantiles de vos données par rapport à une droite de référence normale. Voir la leçon dédiée sur le Q-Q plot.
Une variable discrète (catégorielle) n’a pas de forme à lisser — vous comptez ses niveaux. geom_bar() fait le comptage pour vous : associez la catégorie à x et il dénombre les lignes dans chaque niveau.
La leçon complète sur le diagramme en barres couvre les barres de valeurs (stat = "identity"), l’ordonnancement et les étiquettes.
N’importe lequel de ces graphiques peut comparer des groupes. Associez la variable de regroupement à fill (ou color) et utilisez une palette adaptée au daltonisme. Ci-dessous, deux courbes de densité aux remplissages semi-transparents, plus une ligne de moyenne en pointillés par groupe calculée en R de base avec tapply().
library(ggplot2)
# Group means in base R (no dplyr) -> a small data frame for the mean lines
mu <- data.frame(
sex = factor(c("F", "M")),
grp.mean = tapply(wdata$weight, wdata$sex, mean)
)
ggplot(wdata, aes(x = weight, fill = sex, color = sex)) +
geom_density(alpha = 0.4) +
geom_vline(data = mu, aes(xintercept = grp.mean, color = sex), linetype = "dashed") +
scale_fill_viridis_d() +
scale_color_viridis_d() +
theme_minimal()
Le même fill = sex fonctionne sur geom_histogram() (ajoutez position = "identity" pour que les groupes se superposent au lieu de s’empiler) et sur stat_ecdf() — un seul graphique, toutes les distributions côte à côte.
Les graphiques ci-dessus ont été rendus lors de la génération du site. 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 R de base ? Voir histogramme et densité avec R de base.
Demandez à Prova « quel graphique dois-je utiliser pour montrer la distribution d’une variable ? » — elle répond avec du code que vous pouvez exécuter, donc l’explication est reproductible. The runtime is the judge. Demander à Prova →
geom_histogram(aes(y = after_stat(density))) afin que les deux couches partagent l’axe des y...density.. déclenche un avertissement de dépréciation. L’ancien code utilisait aes(y = ..density..) ; ggplot2 actuel préfère aes(y = after_stat(density)). Les deux calculent la même chose — utilisez la nouvelle forme.position = "identity" (avec alpha pour qu’elles restent lisibles) pour superposer les groupes à la place.Associez la variable à x et ajoutez la couche qui correspond à son type : geom_histogram() ou geom_density() pour une variable continue, stat_ecdf() pour une vue cumulative, ou geom_bar() pour une variable discrète (catégorielle).
Un histogramme répartit les valeurs en intervalles et les compte, donc son aspect dépend de la largeur d’intervalle choisie. Un graphique de densité est une estimation lisse, sans mise en intervalles, de la même distribution. Utilisez un histogramme pour des comptages bruts et une courbe de densité pour une forme nette ; superposez les deux sur l’échelle de densité pour tirer le meilleur de chacun.
Placez l’histogramme sur l’échelle de densité avec aes(y = after_stat(density)), puis ajoutez geom_density() : ggplot(df, aes(x = v)) + geom_histogram(aes(y = after_stat(density))) + geom_density(). Partager l’échelle de densité garde la courbe visible au lieu de l’aplatir au bas.
Ajoutez geom_vline(aes(xintercept = mean(v)), linetype = "dashed"). Pour une moyenne par groupe, calculez d’abord les moyennes de groupe (par exemple avec tapply() en R de base) et passez ce data frame à geom_vline() avec color associé au groupe.
Associez la variable de regroupement à fill (et color) à l’intérieur de aes(). Sur un graphique de densité ajoutez alpha pour un chevauchement semi-transparent ; sur un histogramme ajoutez position = "identity" pour que les groupes se superposent au lieu de s’empiler. Ajoutez une palette adaptée au daltonisme avec scale_fill_viridis_d().
Complétez la couche d’histogramme pour qu’elle se place sur l’échelle de densité, laissant la courbe de densité transparaître.
library(ggplot2)
set.seed(1234)
wdata <- data.frame(weight = c(rnorm(200, 55), rnorm(200, 58)))
ggplot(wdata, aes(x = weight)) +
geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "white", color = "black") +
geom_density(color = "#d1495b", linewidth = 1) +
theme_minimal()
Vous avez une colonne de catégories (par exemple un groupe de traitement) et voulez montrer combien d’observations tombent dans chacune. Vers quel geom vous tournez-vous ?
geom_bar() — il compte automatiquement les lignes dans chaque niveau de la variable catégorielle. Histogramme, densité et ECDF sont pour les variables continues ; le diagramme en barres est l’outil pour les variables discrètes.
Vous avez fait correspondre le graphique à la variable : histogramme, densité, histogramme+densité combinés et ECDF pour une variable continue, un diagramme en barres pour une variable discrète, plus une ligne de moyenne et une séparation par groupe qui fonctionnent sur tous. Choisissez la leçon dédiée lorsque vous voulez peaufiner l’un de ces graphiques.
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.
Prouvez que vous savez le faire. Maîtrisez toute la série ggplot2 — suivez votre parcours, construisez des projets et obtenez un certificat.
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
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
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.
Cette leçon est reproductible : les figures sont exécutées lors de la génération du site (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.
@online{2026,
author = {},
title = {Distribution d’une variable en R : tracer une variable avec
ggplot2},
date = {2026-06-27},
url = {https://www.datanovia.com/learn/data-visualization/ggplot2/distribution-one-variable},
langid = {fr}
}