library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
stat_ecdf(geom = "step", colour = "#3a86d4", linewidth = 0.9) +
labs(x = "Waiting time (min)", y = "Proportion ≤ x") +
theme_minimal()
Tracez une fonction de répartition empirique avec stat_ecdf() — en direct dans votre navigateur
Apprenez à tracer une fonction de répartition empirique (ECDF) en R avec ggplot2 — dessinez-la avec stat_ecdf() en courbe en escalier ou en points, lisez les percentiles dessus, et comparez des groupes par la couleur et le type de ligne. Modifiez et exécutez le code en direct, sans rien installer.
20 juin 2026
7 juillet 2026
x et dessinez la courbe avec stat_ecdf() — aucun attribut esthétique y n’est nécessaire.geom = "step" pour la courbe en escalier classique, ou geom = "point" pour marquer chaque saut.colour (et éventuellement à linetype) ; utilisez une palette adaptée au daltonisme (scale_colour_viridis_d()).linewidth pour garder lisibles des courbes qui se chevauchent.Une fonction de répartition empirique (ECDF) répond à une question simple pour chaque valeur de vos données : quelle fraction des observations se situe à ce niveau ou en dessous ? Le résultat est une courbe qui grimpe de 0 à 1 — une image complète et non paramétrique d’une distribution, sans classes à régler ni lissage à choisir. C’est la façon la plus honnête de lire les percentiles directement : la hauteur de la courbe à n’importe quel x est exactement la proportion de données ≤ x. En R, ggplot2 en dessine une avec une seule couche — stat_ecdf() — et permet de changer facilement de géométrie et de comparer des groupes. Cette leçon en construit une é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 le jeu de données intégré faithful : 272 éruptions du geyser Old Faithful, qui enregistrent pour chaque éruption sa durée (eruptions, en minutes) et le temps d’attente jusqu’à la suivante (waiting, en minutes). Nous tracerons l’ECDF de waiting — une variable clairement bimodale qui rend la forme en escalier facile à voir.
Associez votre variable numérique à x et ajoutez stat_ecdf(). La géométrie par défaut est "step", qui dessine l’escalier classique : un palier horizontal à chaque hauteur, avec un saut vertical à chaque valeur observée. Il n’y a aucun attribut esthétique y — stat_ecdf() calcule la proportion cumulée pour vous.
Passez à geom = "point" pour marquer la valeur de chaque marche par un point plutôt que de dessiner l’escalier qui les relie. Cela met en évidence les observations individuelles derrière la courbe — pratique pour de petits échantillons où vous voulez voir chaque saut.
La véritable force de l’ECDF est qu’on la lit directement. Tracez une ligne horizontale à une probabilité et regardez où elle rencontre la courbe : à 0,5 vous lisez la médiane, à 0,25 le premier quartile. Ci-dessous, les repères en pointillés marquent la médiane — le x où la courbe croise 50 %. Environ 30 % des temps d’attente sont inférieurs à 60 minutes (repérez 60 sur l’axe des x et lisez-y la hauteur de la courbe), ce qui correspond au regroupement des éruptions courtes de cette distribution bimodale.
library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
stat_ecdf(geom = "step", colour = "#3a86d4", linewidth = 0.9) +
geom_hline(yintercept = 0.5, linetype = "dashed", colour = "grey50") +
geom_vline(xintercept = median(faithful$waiting), linetype = "dashed", colour = "grey50") +
labs(x = "Waiting time (min)", y = "Proportion ≤ x") +
theme_minimal()
Une ECDF est plus lisible quand l’axe des y nomme ce qu’il montre. Par convention, la proportion cumulée s’écrit F(x). Utilisez labs() pour définir une étiquette x claire, l’étiquette y F(x), et un titre qui énonce la question à laquelle le graphique répond.
Pour comparer des distributions, associez une variable de regroupement à colour ; ggplot2 dessine une courbe ECDF par groupe sur le même panneau. Là où une courbe se situe à gauche d’une autre, ce groupe tend à avoir des valeurs plus petites. Ici, nous séparons les éruptions en courtes (eruptions < 3 min) et en longues — dérivées dans le bloc avec R de base — et utilisons une palette viridis adaptée au daltonisme pour que la figure reste lisible pour tout le monde.
library(ggplot2)
df <- faithful
df$eruption_type <- ifelse(df$eruptions < 3, "Short", "Long")
ggplot(df, aes(x = waiting, colour = eruption_type)) +
stat_ecdf(geom = "step", linewidth = 0.9) +
scale_colour_viridis_d() +
labs(x = "Waiting time (min)", y = "Proportion ≤ x", colour = "Eruption") +
theme_minimal()
La couleur seule peut échouer à l’impression en niveaux de gris ou pour certains lecteurs. Associez la même variable de regroupement à linetype en plus de colour afin que les courbes restent distinguables par deux canaux redondants — un petit gain d’accessibilité.
library(ggplot2)
df <- faithful
df$eruption_type <- ifelse(df$eruptions < 3, "Short", "Long")
ggplot(df, aes(x = waiting, colour = eruption_type, linetype = eruption_type)) +
stat_ecdf(geom = "step", linewidth = 0.9) +
scale_colour_viridis_d() +
labs(x = "Waiting time (min)", y = "Proportion ≤ x",
colour = "Eruption", linetype = "Eruption") +
theme_minimal()
Quand des courbes se chevauchent ou que le graphique est affiché en petit, épaississez la ligne pour qu’elle se lise clairement. Contrôlez le trait avec linewidth (dans les anciennes versions de ggplot2, c’était size) ; une valeur autour de 1.2–1.4 fait ressortir une ECDF unique.
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 ECDF matplotlib / seaborn arrive dans la série Python.
Demandez à Prova « lis les 25e, 50e et 75e percentiles du temps d’attente sur cette ECDF » — elle répond avec du code que vous pouvez exécuter, donc l’explication est reproductible. The runtime is the judge. Ask Prova →
Associez votre variable numérique à x et ajoutez une seule couche stat_ecdf() — par exemple ggplot(faithful, aes(x = waiting)) + stat_ecdf(). Il n’y a aucun attribut esthétique y : stat_ecdf() calcule la proportion cumulée pour vous.
geom = "step" et geom = "point" dans stat_ecdf() ?
geom = "step" (la valeur par défaut) dessine l’escalier classique — un palier horizontal à chaque hauteur avec un saut vertical à chaque valeur — tandis que geom = "point" marque la valeur de chaque marche par un point au lieu de les relier. Utilisez "point" pour de petits échantillons où vous voulez voir chaque saut individuel.
Lisez les percentiles directement sur la courbe : le x où la courbe croise 0,5 est la médiane, et là où elle croise 0,25 se trouve le premier quartile. Ajoutez geom_hline(yintercept = 0.5) et geom_vline(xintercept = median(faithful$waiting)) comme repères en pointillés pour marquer visuellement la médiane.
Associez la variable de regroupement à colour, par exemple aes(x = waiting, colour = eruption_type), et ggplot2 dessine une courbe ECDF par groupe sur le même panneau. Une courbe située à gauche d’une autre signifie que ce groupe tend à avoir des valeurs plus petites ; associez-la à scale_colour_viridis_d() pour une palette adaptée au daltonisme.
size ne change-t-il plus l’épaisseur de ma ligne ECDF ?
Les versions récentes de ggplot2 contrôlent l’épaisseur de la ligne avec linewidth, et non size — définissez stat_ecdf(linewidth = 1.4) pour épaissir la courbe. L’attribut esthétique size s’applique toujours quand vous utilisez geom = "point", où il définit la taille des points.
Complétez le code pour qu’il dessine une ECDF en escalier de la durée eruptions (et non de waiting).
library(ggplot2)
ggplot(faithful, aes(x = eruptions)) +
stat_ecdf(geom = "step", colour = "#3a86d4", linewidth = 0.9) +
labs(x = "Eruption duration (min)", y = "Proportion ≤ x") +
theme_minimal()
Vous avez construit une ECDF ggplot2 avec stat_ecdf(), basculé entre les géométries en escalier et en points, lu les percentiles directement sur la courbe, étiqueté les axes avec F(x), comparé des groupes par la couleur et le type de ligne sur un même panneau, et ajusté l’épaisseur de la ligne. L’ECDF est la compagne sans classes ni lissage du graphique de densité et de l’histogramme — choisissez-la quand vous voulez lire des proportions et des percentiles avec exactitude. Explorez ensuite le reste de la grammaire de ggplot2.
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 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.
@online{2026,
author = {},
title = {Graphique ECDF en R : guide ggplot2},
date = {2026-06-20},
url = {https://www.datanovia.com/learn/data-visualization/ggplot2/ecdf},
langid = {fr}
}