Graphique ECDF en R : guide ggplot2

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.

Date de publication

20 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Une ECDF (fonction de répartition empirique) trace, pour chaque valeur x, la proportion d’observations ≤ x — elle va de 0 jusqu’à 1.
  • Dans ggplot2, vous associez votre variable numérique à x et dessinez la courbe avec stat_ecdf() — aucun attribut esthétique y n’est nécessaire.
  • Utilisez geom = "step" pour la courbe en escalier classique, ou geom = "point" pour marquer chaque saut.
  • Lisez les percentiles directement sur la courbe : le x où la courbe croise 0,5 est la médiane ; là où elle croise 0,25 se trouve le premier quartile.
  • Comparez des groupes sur un même panneau en associant la variable de regroupement à colour (et éventuellement à linetype) ; utilisez une palette adaptée au daltonisme (scale_colour_viridis_d()).
  • Ajustez linewidth pour garder lisibles des courbes qui se chevauchent.
  • 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

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.

ECDF en escalier de base

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 ystat_ecdf() calcule la proportion cumulée pour vous.

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

ggplot2 step ECDF of Old Faithful waiting times; the staircase curve rises from 0 to 1 with a steep middle section.

ECDF en points

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.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  stat_ecdf(geom = "point", colour = "#3a86d4", size = 1.2) +
  labs(x = "Waiting time (min)", y = "Proportion ≤ x") +
  theme_minimal()

ggplot2 point ECDF of Old Faithful waiting times; each observation appears as a dot rising from 0 to 1.

Lire les percentiles sur la courbe

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

ggplot2 step ECDF of waiting times with dashed guide lines marking the median where the curve crosses the 0.5 probability.

Étiqueter les axes et le titre

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.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  stat_ecdf(geom = "step", colour = "#3a86d4", linewidth = 0.9) +
  labs(
    title = "Cumulative distribution of Old Faithful waiting times",
    x = "Waiting time (min)",
    y = "F(x): proportion of eruptions ≤ x"
  ) +
  theme_minimal()

ggplot2 step ECDF of waiting times with a descriptive title, an x-axis label, and the y-axis labelled F(x).

Comparer des groupes par la couleur

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

ggplot2 ECDF with two coloured step curves comparing waiting times after short versus long eruptions; the short-eruption curve sits to the left.

Distinguer aussi les groupes par le type de ligne

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

ggplot2 ECDF comparing two groups, each curve distinguished by both a viridis colour and a solid-versus-dashed linetype.

Ajuster l’épaisseur de la courbe

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.21.4 fait ressortir une ECDF unique.

library(ggplot2)
ggplot(faithful, aes(x = waiting)) +
  stat_ecdf(geom = "step", colour = "#3a86d4", linewidth = 1.4) +
  labs(x = "Waiting time (min)", y = "Proportion ≤ x") +
  theme_minimal()

ggplot2 step ECDF of waiting times drawn with a thicker line for legibility.

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 ECDF matplotlib / seaborn arrive dans la série Python.

🟢 Avec un agent IA

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 →

Questions fréquentes

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

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.

Testez vos connaissances

Complétez le code pour qu’il dessine une ECDF en escalier de la durée eruptions (et non de waiting).

# Add stat_ecdf() with geom = "step"
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()
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()

Conclusion

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.

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