Ajoutez des barres d’erreur aux diagrammes en barres, courbes et points avec geom_errorbar() — en direct dans votre navigateur
Apprenez à ajouter des barres d’erreur en R avec ggplot2 — résumez la moyenne ± écart-type avec aggregate() de base, puis tracez-les avec geom_errorbar(), geom_pointrange() et leurs proches sur des diagrammes en barres, des graphiques en courbes et des graphiques groupés. Modifiez et exécutez le code en direct, sans installation.
Date de publication
20 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
Les barres d’erreur montrent la dispersion ou l’incertitude autour d’une valeur résumée (une moyenne) — typiquement moyenne ± écart-type (SD), erreur standard (SE) ou un intervalle de confiance (CI).
Le schéma comporte toujours deux étapes : résumer vos données (moyenne et dispersion par groupe), puis tracer avec geom_errorbar() mappé à ymin/ymax.
Construisez la table de résumé dans le bloc avec aggregate() de base — aucun paquet supplémentaire, fonctionne partout.
Ajoutez des barres à un diagramme en barres (geom_col), à un graphique en courbes (geom_line + geom_point), ou utilisez geom_pointrange() pour un point-avec-intervalle épuré.
Pour plusieurs groupes, mappez la variable de groupement à fill/colour et alignez le tout avec position_dodge().
Choisissez délibérément ce que la barre signifie (SD vs SE vs CI) — et étiquetez-la — car elles répondent à des questions différentes.
Chaque graphique ci-dessous est rendu pour vous — modifiez ensuite n’importe quel exemple en direct dans le bac à sable.
Les barres d’erreur transforment une simple valeur résumée en une valeur honnête : elles montrent à quel point les données varient (ou à quel point l’estimation est incertaine) autour de chaque moyenne. En R, ggplot2 les trace avec une seule couche — geom_errorbar() — plus quelques proches (geom_pointrange(), geom_linerange(), geom_crossbar()). Le travail réside dans le résumé préalable : chaque graphique a besoin d’une petite table de moyennes et de dispersions. Cette leçon construit cette table dans le bloc avec R de base, puis ajoute des barres aux diagrammes en barres, aux graphiques en courbes et aux graphiques groupés ; les figures sont rendues ici même, et vous pouvez réexécuter ou modifier n’importe laquelle d’entre elles en direct.
Nous utilisons le jeu de données intégré ToothGrowth : la longueur des cellules odontoblastes (len) chez des cobayes ayant reçu de la vitamine C à trois doses (dose : 0,5, 1 ou 2 mg/jour) selon deux méthodes d’administration (supp : jus d’orange OJ ou acide ascorbique VC).
La table de résumé : moyenne ± écart-type avec aggregate() de base
Chaque barre d’erreur a besoin de deux nombres par groupe : un centre (la moyenne) et une dispersion (ici l’écart-type). Calculez les deux avec aggregate() de base afin que le code soit autonome — aucun paquet supplémentaire. Nous fusionnons les deux résultats en une seule table de données bien structurée que les graphiques peuvent réutiliser.
library(ggplot2)# summarise in-block with base R: mean + sd of len per dosem <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_point(size =3, colour ="#3a86d4") +geom_errorbar(aes(ymin = len - sd, ymax = len + sd), width =0.2, colour ="#3a86d4") +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
Le mappage clé est aes(ymin = len - sd, ymax = len + sd) — geom_errorbar() trace une ligne verticale de ymin à ymax avec un petit chapeau horizontal, dimensionné par width.
Diagramme en barres avec barres d’erreur
La demande la plus courante : un diagramme en barres des moyennes de groupe avec des barres d’erreur par-dessus. Tracez les barres avec geom_col() (il utilise la valeur y comme hauteur), puis superposez le même geom_errorbar().
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_col(fill ="#3a86d4", alpha =0.7) +geom_errorbar(aes(ymin = len - sd, ymax = len + sd), width =0.2) +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
Graphique en courbes avec barres d’erreur
Pour un axe des x ordonné (une dose, un instant), un graphique en courbes se lit comme une tendance. Ajoutez geom_line() et geom_point(), et comme le x est un facteur vous devez indiquer à ggplot2 que les points appartiennent à une seule série avec group = 1.
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len, group =1)) +geom_line(colour ="#3a86d4") +geom_point(size =2.5, colour ="#3a86d4") +geom_errorbar(aes(ymin = len - sd, ymax = len + sd), width =0.2, colour ="#3a86d4") +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
Barres d’erreur vers le haut uniquement
Parfois vous souhaitez seulement montrer la barre s’étendant vers le haut depuis la moyenne — courant sur les diagrammes en barres pour éviter qu’ils ne paraissent encombrés. Réglez ymin sur la moyenne elle-même afin que la moitié inférieure disparaisse.
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_col(fill ="#3a86d4", alpha =0.7) +geom_errorbar(aes(ymin = len, ymax = len + sd), width =0.2) +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
geom_pointrange() : un point au milieu
geom_pointrange() trace le même intervalle mais place le point moyen au centre et la dispersion comme une fine ligne le traversant — plus épuré qu’une barre lorsque vous n’avez pas besoin du chapeau. Il interprète ymin/ymax exactement comme geom_errorbar().
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_pointrange(aes(ymin = len - sd, ymax = len + sd), colour ="#3a86d4") +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
geom_linerange() : la ligne d’intervalle seule
geom_linerange() trace uniquement l’étendue verticale — pas de point, pas de chapeaux. Associez-le à votre propre geom_point() lorsque vous voulez un contrôle total sur le marqueur.
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_linerange(aes(ymin = len - sd, ymax = len + sd), colour ="#3a86d4") +geom_point(size =2.5, colour ="#3a86d4") +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
geom_crossbar() : une barre creuse avec une ligne de moyenne
geom_crossbar() trace une boîte creuse s’étendant de ymin à ymax avec une ligne horizontale au niveau de la moyenne (y) — une manière compacte de montrer l’intervalle et son centre ensemble.
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_crossbar(aes(ymin = len - sd, ymax = len + sd), fill ="#3a86d4", alpha =0.3, width =0.5) +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)") +theme_minimal()
Barres d’erreur groupées : une seconde variable + position_dodge()
Avec deux variables de groupement vous voulez les barres côte à côte, et non empilées. Résumez selon les deuxdose et supp, mappez supp à fill, et passez la même largeur position_dodge() à chaque couche afin que les barres et leurs barres d’erreur s’alignent.
library(ggplot2)# summarise by BOTH dose and suppm <-aggregate(len ~ dose + supp, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose + supp, data = ToothGrowth, FUN = sd)df <-merge(m, s, by =c("dose", "supp"))names(df) <-c("dose", "supp", "len", "sd")df$dose <-factor(df$dose)dodge <-position_dodge(width =0.9)ggplot(df, aes(x = dose, y = len, fill = supp)) +geom_col(position = dodge) +geom_errorbar(aes(ymin = len - sd, ymax = len + sd),width =0.2, position = dodge) +scale_fill_viridis_d() +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)", fill ="Supplement") +theme_minimal()
Largeur des barres d’erreur et alignement du décalage
Deux réglages contrôlent l’apparence des barres groupées : width sur geom_errorbar() dimensionne le chapeau, et la même largeur position_dodge() sur chaque couche maintient chaque barre d’erreur centrée au-dessus de sa barre. Si les chapeaux dérivent latéralement, c’est que vos largeurs de décalage ne concordent pas d’une couche à l’autre.
library(ggplot2)m <-aggregate(len ~ dose + supp, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose + supp, data = ToothGrowth, FUN = sd)df <-merge(m, s, by =c("dose", "supp"))names(df) <-c("dose", "supp", "len", "sd")df$dose <-factor(df$dose)ggplot(df, aes(x = dose, y = len, colour = supp)) +geom_pointrange(aes(ymin = len - sd, ymax = len + sd),position =position_dodge(width =0.4)) +scale_colour_viridis_d() +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SD)", colour ="Supplement") +theme_minimal()
Superposer les données brutes
Une moyenne ± écart-type masque les observations réelles. Superposez geom_jitter() à partir du jeu de données complet sous le résumé pour que le lecteur voie à la fois la dispersion des points et l’intervalle de résumé — la version honnête d’un diagramme en barres.
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(mapping =aes(x =factor(dose), y = len)) +geom_jitter(data = ToothGrowth, width =0.12, alpha =0.4, colour ="grey50") +geom_pointrange(data = df, aes(ymin = len - sd, ymax = len + sd),colour ="#3a86d4", size =0.8) +labs(x ="Dose (mg/day)", y ="Tooth length") +theme_minimal()
SD vs SE vs CI : choisir ce que montre la barre
La géométrie est identique — ce qui change, c’est le nombre que vous placez dans ymin/ymax, et cela change le sens :
SD (écart-type) — à quel point les valeurs brutes sont dispersées. Ne diminue pas avec davantage de données.
SE (erreur standard = SD / √n) — à quel point l’estimation de la moyenne est précise. Diminue à mesure que n augmente.
CI (intervalle de confiance, souvent ≈ moyenne ± 1,96 × SE) — une plage qui, par convention, contient la vraie moyenne 95 % du temps.
Étiquetez toujours celle que vous avez utilisée. Ici nous traçons l’erreur standard au lieu de l’écart-type :
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)n <-aggregate(len ~ dose, data = ToothGrowth, FUN = length)df <-data.frame(dose =factor(m$dose), len = m$len, se = s$len /sqrt(n$len))ggplot(df, aes(x = dose, y = len)) +geom_col(fill ="#3a86d4", alpha =0.7) +geom_errorbar(aes(ymin = len - se, ymax = len + se), width =0.2) +labs(x ="Dose (mg/day)", y ="Tooth length (mean ± SE)") +theme_minimal()
Vous pouvez aussi laisser ggplot2 calculer l’intervalle à la volée avec stat_summary(fun.data = mean_se, ...), mais le schéma explicite résumé-puis-geom_errorbar() ci-dessus est plus clair et plus facile à déboguer.
Barres d’erreur horizontales
Lorsque vos catégories s’étalent le long de l’axe des y (une disposition retournée ou naturellement horizontale), passez à geom_errorbarh() et mappez xmin/xmax à la place.
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = len, y = dose)) +geom_point(size =3, colour ="#3a86d4") +geom_errorbarh(aes(xmin = len - sd, xmax = len + sd), height =0.2, colour ="#3a86d4") +labs(x ="Tooth length (mean ± SD)", y ="Dose (mg/day)") +theme_minimal()
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 des barres d’erreur avec matplotlib / plotnine arrive dans la série Python.
🟢 Avec un agent IA
Demandez à Prova« ces barres d’erreur devraient-elles montrer le SD, le SE ou un intervalle de confiance pour mes données ? » — 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
NoteComment ajouter des barres d’erreur à un diagramme en barres avec ggplot2 ?
Tracez les barres avec geom_col() à partir d’une table de résumé des moyennes de groupe, puis superposez geom_errorbar(aes(ymin = len - sd, ymax = len + sd), width = 0.2) par-dessus. La barre d’erreur lit ymin/ymax depuis la dispersion que vous avez calculée (par exemple moyenne ± écart-type).
NoteComment calculer la moyenne et l’écart-type pour les barres d’erreur sans dplyr ?
Utilisez aggregate() de base deux fois — une fois avec FUN = mean et une fois avec FUN = sd — puis combinez les deux résultats en une seule table de données. Par exemple, aggregate(len ~ dose, data = ToothGrowth, FUN = mean) donne les moyennes par groupe, sans aucun paquet supplémentaire.
NotePourquoi mes barres d’erreur groupées ne sont-elles pas alignées avec les barres ?
Vos couches utilisent des réglages de décalage différents. Définissez un seul position_dodge(width = 0.9) et passez le même objet à chaque couche (geom_col(position = dodge) et geom_errorbar(..., position = dodge)) afin que chaque barre d’erreur reste centrée au-dessus de sa barre.
NoteLes barres d’erreur devraient-elles montrer le SD, le SE ou un intervalle de confiance ?
Elles répondent à des questions différentes : le SD montre à quel point les valeurs brutes sont dispersées, le SE (= sd / sqrt(n)) montre à quel point l’estimation de la moyenne est précise, et un CI (≈ moyenne ± 1,96 × SE) est une plage qui, par convention, contient la vraie moyenne 95 % du temps. La géométrie est identique — seul le nombre dans ymin/ymax change — alors étiquetez toujours celle que vous avez utilisée.
NoteQuelle est la différence entre geom_errorbar(), geom_pointrange() et geom_crossbar() ?
Toutes trois lisent ymin/ymax, mais les tracent différemment : geom_errorbar() fait une ligne verticale à chapeaux, geom_pointrange() place le point moyen au centre d’une fine ligne d’intervalle, et geom_crossbar() trace une boîte creuse avec une ligne horizontale au niveau de la moyenne (y). Utilisez geom_linerange() lorsque vous voulez uniquement l’étendue de l’intervalle, sans point ni chapeaux.
Testez vos connaissances
ImportantExercice : ajoutez les barres d’erreur
La table de résumé est construite pour vous. Complétez le code pour que chaque barre reçoive une barre d’erreur de moyenne ± écart-type.
# Use geom_errorbar() and map ymin = len - sd, ymax = len + sd inside aes()
library(ggplot2)
m <- aggregate(len ~ dose, data = ToothGrowth, FUN = mean)
s <- aggregate(len ~ dose, data = ToothGrowth, FUN = sd)
df <- data.frame(dose = factor(m$dose), len = m$len, sd = s$len)
ggplot(df, aes(x = dose, y = len)) +
geom_col(fill = "#3a86d4", alpha = 0.7) +
geom_errorbar(aes(ymin = len - sd, ymax = len + sd), width = 0.2)
library(ggplot2)m <-aggregate(len ~ dose, data = ToothGrowth, FUN = mean)s <-aggregate(len ~ dose, data = ToothGrowth, FUN = sd)df <-data.frame(dose =factor(m$dose), len = m$len, sd = s$len)ggplot(df, aes(x = dose, y = len)) +geom_col(fill ="#3a86d4", alpha =0.7) +geom_errorbar(aes(ymin = len - sd, ymax = len + sd), width =0.2)
Conclusion
Vous avez résumé ToothGrowth avec aggregate() de base, puis ajouté des barres d’erreur à un graphique en points, à un diagramme en barres et à un graphique en courbes avec geom_errorbar() ; essayé geom_pointrange(), geom_linerange() et geom_crossbar() ; décalé des barres groupées avec une seconde variable ; superposé les données brutes ; et choisi délibérément entre SD, SE et CI. Ensuite, explorez la boîte à moustaches et le graphique en violon — qui montrent une distribution complète plutôt qu’un simple résumé — et le reste de la grammaire de ggplot2.
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.