Distribution d’une variable en R : tracer une variable avec ggplot2

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.

Date de publication

27 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Le graphique pour une variable dépend de son type : continue → histogramme, densité, ECDF ; discrète → diagramme en barres.
  • 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.
  • Ajoutez une ligne de référence pour la moyenne avec geom_vline(), et séparez n’importe lequel de ces graphiques par groupe avec fill/color.
Obtenez le livre — GGPlot2 Essentials (PDF)

Introduction

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.

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

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().

library(ggplot2)
ggplot(wdata, aes(x = weight)) +
  geom_histogram(bins = 30, fill = "#3a86d4", color = "white") +
  geom_vline(aes(xintercept = mean(weight)), linetype = "dashed", linewidth = 0.6) +
  theme_minimal()

ggplot2 histogram of weight split into 30 bins, with a dashed vertical line marking the mean weight.

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.

Graphique de densité

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.

library(ggplot2)
ggplot(wdata, aes(x = weight)) +
  geom_density(fill = "#3a86d4", alpha = 0.5) +
  geom_vline(aes(xintercept = mean(weight)), linetype = "dashed", linewidth = 0.6) +
  theme_minimal()

ggplot2 density curve of weight filled in brand azure, with a dashed vertical line at the mean.

La leçon sur le graphique de densité couvre en profondeur la largeur de bande, les remplissages et les courbes groupées.

Combiner histogramme et densité

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.

library(ggplot2)
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()

ggplot2 histogram of weight on the density scale with a smooth density curve overlaid in red.

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.

Distribution cumulative empirique (ECDF)

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.

library(ggplot2)
ggplot(wdata, aes(x = weight)) +
  stat_ecdf(geom = "step", color = "#3a86d4", linewidth = 1) +
  labs(y = "Proportion ≤ x") +
  theme_minimal()

ggplot2 empirical cumulative distribution step function of weight, rising from 0 to 1.

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.

NoteVous vérifiez la normalité ? Utilisez un Q-Q plot

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.

Variable discrète : diagramme en barres

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.

library(ggplot2)
ggplot(wdata, aes(x = sex)) +
  geom_bar(fill = "#3a86d4") +
  theme_minimal()

ggplot2 bar chart counting the number of observations in each sex category, F and M.

La leçon complète sur le diagramme en barres couvre les barres de valeurs (stat = "identity"), l’ordonnancement et les étiquettes.

Séparer la distribution par groupe

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()

ggplot2 density plot of weight with one filled curve per sex and a dashed vertical mean line for each group.

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.

Essayez en direct

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.

🟢 Avec un agent IA

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 →

Problèmes courants

  • La courbe de densité paraît plate lorsqu’elle est superposée à un histogramme. L’histogramme est sur l’échelle des comptages (barres hautes) tandis que la densité est proche de 0. Placez l’histogramme sur l’échelle de densité avec 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.
  • Les histogrammes groupés se masquent mutuellement. Par défaut les barres s’empilent. Ajoutez position = "identity" (avec alpha pour qu’elles restent lisibles) pour superposer les groupes à la place.

Questions fréquentes

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().

Testez vos connaissances

Complétez la couche d’histogramme pour qu’elle se place sur l’échelle de densité, laissant la courbe de densité transparaître.

# Map y to the density statistic with after_stat()
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()
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.

Conclusion

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.

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 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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“Distribution d’une variable en R : tracer une variable avec ggplot2.” 2026. June 27. https://www.datanovia.com/learn/data-visualization/ggplot2/distribution-one-variable.