Barres d’erreur en R : guide ggplot2

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.
Obtenez le livre — GGPlot2 Essentials (PDF)

Introduction

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

ggplot2 plot of mean tooth length by vitamin C dose with vertical error bars showing mean plus or minus one standard deviation.

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

ggplot2 bar plot of mean tooth length by vitamin C dose, each bar topped with an error bar of plus or minus one standard deviation.

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

ggplot2 line plot of mean tooth length rising with vitamin C dose, with a point and an error bar at each dose.

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

ggplot2 bar plot of mean tooth length by dose with error bars drawn only above each bar.

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

ggplot2 point-range plot of mean tooth length by dose; each mean is a point with a line spanning plus or minus one standard deviation.

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

ggplot2 plot of tooth length by dose showing a plain vertical interval line at each dose with a separate mean point.

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

ggplot2 cross-bar plot of tooth length by dose; each group is a hollow box from minus to plus one SD with a line marking the mean.

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 deux dose 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 supp
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)

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

ggplot2 grouped bar plot of mean tooth length by dose with orange-juice and ascorbic-acid bars side by side, each with an error bar.

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

ggplot2 grouped point-range plot of mean tooth length by dose and supplement, dodged so each group's interval is centred and separated.

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

ggplot2 plot of tooth length by dose with jittered raw data points behind a mean point and an error bar for each dose.

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

ggplot2 bar plot of mean tooth length by dose with narrower error bars showing the standard error of the mean.

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

ggplot2 horizontal plot with dose on the y-axis and mean tooth length on the x-axis, each mean point flanked by a horizontal error bar.

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

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

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.

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.

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.

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

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.

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