Statistiques résumées sur un graphique en R (ggpubr)

Calculez n, moyenne, médiane et IQR avec rstatix, puis affichez-les sur un graphique ggpubr avec une table résumée en dessous

Ajoutez des statistiques résumées à un graphique en R avec ggpubr et rstatix. Calculez les statistiques de groupe (n, moyenne, sd, médiane, IQR) avec get_summary_stats() et desc_statby(), tracez le graphique-plus-table en un seul appel avec ggsummarystats(), et construisez la recette à la main — une boîte à moustaches empilée sur une table résumée avec ggsummarytable() et ggarrange(). Chaque exemple se rend et s’exécute en direct dans votre navigateur.

Date de publication

22 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Obtenez d’abord les chiffres. rstatix::get_summary_stats() renvoie une table structurée de statistiques de groupe (n, moyenne, sd, médiane, IQR, …) ; desc_statby() est l’équivalent ggpubr avec se et ci.
  • Un seul appel fait le graphique + la table : ggsummarystats() dessine une boîte à moustaches/un violon/des barres/une courbe avec une table résumée en dessous, alignée sur les groupes en x — choisissez le graphique avec ggfunc = ggboxplot (ou ggviolin, ggbarplot, ggline).
  • Choisissez quelles statistiques apparaissent avec summaries = c("n", "median", "iqr") et colorez ou groupez exactement comme vous le feriez avec le graphique sous-jacent.
  • Construisez-la à la main pour un contrôle total : un graphique en haut, une ggsummarytable() des statistiques en dessous, empilés avec ggarrange(..., ncol = 1, align = "v") — la recette « beau graphique avec une table résumée ».
  • Facettez en multipanneau avec facet.by — chaque panneau reçoit sa propre table résumée alignée.
  • Chaque graphique ci-dessous est rendu pour vous, puis modifiable en direct dans le bac à sable.
Obtenez le livre — R Graphics Essentials (PDF)

Introduction

Une bonne figure de comparaison de groupes fait deux choses à la fois : elle montre la distribution et elle énonce les chiffres — taille d’échantillon, médiane, IQR — pour que le lecteur n’ait pas à scruter les boîtes. En R, le package ggpubr et son compagnon statistique rstatix en font une recette en un seul appel : calculez le résumé, puis affichez-le sur le graphique ou dessinez une petite table sous chaque groupe.

Deux éléments font le travail :

  • rstatix calcule les statistiques — get_summary_stats() pour une table structurée n/moyenne/sd/médiane/IQR, desc_statby() (dans ggpubr) quand vous voulez aussi l’erreur standard et les intervalles de confiance.
  • ggpubr les dessine — ggsummarystats() pour le tout-en-un graphique + table résumée alignée, ou ggsummarytable() + ggarrange() quand vous voulez construire le panneau à la main.

Cette leçon parcourt tout le flux de travail sur les données intégrées ToothGrowth — la longueur len des dents à travers trois niveaux de dose et deux suppléments supp. Chaque figure est rendue ici même, et vous pouvez réexécuter ou modifier n’importe laquelle en direct.

Vous voulez une table autonome et entièrement stylisée (cellules colorées, thème personnalisé, une table en tant que figure) ? C’est la leçon ggtexttable — ici nous utilisons la table seulement comme une bande de légende sous un graphique.

Obtenez d’abord les statistiques résumées

Avant de pouvoir afficher des statistiques sur un graphique, il vous les faut sous forme de data frame. get_summary_stats() de rstatix prend les données et la variable et renvoie une table structurée — une ligne par groupe, des colonnes pour n, moyenne, sd, médiane, IQR et plus encore. Groupez avec une formule ou l’argument vars/groupe ; ici nous résumons len au sein de chaque dose.

library(rstatix)
df <- ToothGrowth
df$dose <- factor(df$dose)

# tidy summary of len within each dose
get_summary_stats(group_by(df, dose), len, type = "common")
# A tibble: 3 × 11
  dose  variable     n   min   max median   iqr  mean    sd    se    ci
  <fct> <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.5   len         20   4.2  21.5   9.85  5.03  10.6  4.5  1.01   2.11
2 1     len         20  13.6  27.3  19.2   7.12  19.7  4.42 0.987  2.07
3 2     len         20  18.5  33.9  26.0   4.3   26.1  3.77 0.844  1.77

Passez type = pour choisir les colonnes : "common" (n, min, max, median, IQR, mean, sd, se, ci), "mean_sd", "median_iqr", "full", ou un vecteur personnalisé. L’équivalent ggpubr, desc_statby(), renvoie le même genre de table avec les colonnes utilisées par les graphiques de ggpubr (mean, sd, se, ci) :

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

# group means, sd, se and ci by dose
desc_statby(df, measure.var = "len", grps = "dose")[, c("dose", "length", "mean", "sd", "se", "ci")]
  dose length   mean       sd        se       ci
1  0.5     20 10.605 4.499763 1.0061776 2.105954
2    1     20 19.735 4.415436 0.9873216 2.066488
3    2     20 26.100 3.774150 0.8439257 1.766357

La recette en un seul appel : ggsummarystats()

ggsummarystats() est le raccourci pour toute la figure : donnez-lui les données, la fonction de tracé et les colonnes, et il dessine le graphique avec une table résumée alignée sous chaque groupe. L’argument ggfunc choisit le graphique — ggboxplot, ggviolin, ggbarplot ou ggline — et tout le reste (add, color, palette) lui est transmis directement.

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggboxplot, add = "jitter",
  summaries = c("n", "median", "iqr")
)

A ggpubr box plot of tooth length by dose with jittered points, and a summary table of sample size, median and IQR drawn beneath each dose group.

Choisissez quelles statistiques apparaissent dans la bande avec summaries = (n’importe quelles colonnes produites par get_summary_stats()). Et comme les arguments supplémentaires de ggfunc sont transmis, vous colorez par groupe exactement comme sur un ggboxplot() normal :

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggboxplot, add = "jitter",
  color = "dose", palette = "npg",
  summaries = c("n", "median", "iqr")
)

A ggpubr box plot of tooth length by dose coloured by dose with the npg palette, over a summary table of n, median and IQR.

Un graphique différent, la même table

ggfunc est la seule chose que vous changez pour échanger le graphique au-dessus de la table. Un violon montre la forme de la distribution ; une barre ou une courbe de moyennes convient quand c’est le résumé, et non la dispersion, qui compte. La table résumée en dessous reste alignée sur les mêmes groupes en x.

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggviolin, add = c("jitter", "median_iqr"),
  summaries = c("n", "median", "iqr")
)

A ggpubr violin plot of tooth length by dose with jittered points, over a summary table of sample size, median and IQR per dose.

Passez à un diagramme en barres de moyennes en nommant simplement ggfunc = ggbarplot (ou ggline pour une courbe) :

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggbarplot, add = c("mean_se", "jitter"),
  summaries = c("n", "mean", "sd")
)

A ggpubr bar plot of mean tooth length by dose with standard-error bars, over a summary table of n, mean and sd per dose.

Grouper par une seconde variable

Passez une variable de groupement à color et ggsummarystats() sépare à la fois le graphique et la table selon ce groupe — une ligne de statistiques par sous-groupe. Ici nous colorons par supplément (supp) :

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggboxplot, add = "jitter",
  color = "supp", palette = "npg",
  summaries = c("n", "median", "iqr")
)

A ggpubr box plot of tooth length by dose with the two supplements coloured by the npg palette, over a summary table with one statistics row per supplement and dose.

Multipanneau : une table résumée par facette

Donnez à facet.by une variable de groupement pour diviser la figure en panneaux — chaque panneau garde sa propre table résumée alignée. labeller = "label_both" affiche le nom de la variable avec le niveau ; "label_value" affiche le niveau seul.

library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggboxplot, add = "jitter",
  color = "dose", palette = "jco",
  facet.by = "supp", labeller = "label_value",
  ggtheme = theme_bw(), legend = "top",
  summaries = c("n", "median", "iqr")
)

A two-panel ggpubr box plot of tooth length by dose, one panel per supplement, each panel carrying its own summary table of n, median and IQR.

Construire la recette à la main

ggsummarystats() est le raccourci ; la construire vous-même donne un contrôle total sur chaque élément — le thème du graphique, les statistiques exactes, les hauteurs relatives. Le schéma se fait en trois étapes : (1) calculer les statistiques, (2) dessiner le graphique et une ggsummarytable() de ces statistiques, (3) les empiler avec ggarrange(..., ncol = 1, align = "v") pour que la table se place sous le graphique, colonnes alignées sur les groupes en x.

library(ggpubr)
library(rstatix)
df <- ToothGrowth
df$dose <- factor(df$dose)

# 1. compute the statistics with rstatix
summary_stats <- get_summary_stats(group_by(df, dose), len, type = "common")
summary_stats <- summary_stats[, c("dose", "n", "median", "iqr")]

# 2a. the main plot
bxp <- ggboxplot(
  df, x = "dose", y = "len", add = "jitter",
  ggtheme = theme_bw()
)

# 2b. the summary table as a plot, stripped of axes for a clean caption strip
summary_plot <- ggsummarytable(
  summary_stats, x = "dose", y = c("n", "median", "iqr"),
  ggtheme = theme_bw()
) +
  clean_table_theme()

# 3. stack plot over table, vertically aligned, table given 20% of the height
ggarrange(
  bxp, summary_plot,
  ncol = 1, align = "v",
  heights = c(0.80, 0.20)
)

A hand-built ggpubr figure: a box plot of tooth length by dose with jittered points on top, and a summary table of sample size, median and IQR aligned beneath, combined with ggarrange.

ggsummarytable() transforme un data frame de statistiques en une bande étiquetée (une colonne de chiffres par groupe en x) ; clean_table_theme() retire ses axes et lignes de grille pour qu’elle se lise comme une légende. ggarrange() fait l’empilement — align = "v" garde les colonnes de la table sous les boîtes correspondantes, et heights fixe le rapport graphique-sur-table.

Besoin d’une table richement stylisée — lignes d’en-tête colorées, cellules mises en évidence, une table qui est la figure plutôt qu’une bande en dessous ? Tournez-vous vers ggtexttable() : voir la leçon ggtexttable pour ttheme(), table_cell_bg() et compagnie.

Essayez en direct

Les graphiques ci-dessus ont été rendus au moment du build. Envie d’expérimenter ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (sans serveur, sans installation). Essayez de remplacer ggfunc = ggboxplot par ggviolin, de changer les summaries en c("n", "mean", "sd"), ou de colorer par color = "supp".

Vous travaillez en Python ? Un guide seaborn + table de statistiques arrive dans la série Python.

🟢 Avec un agent IA

Demandez à Prova « comment ajouter une table résumée de n, médiane et IQR sous ma boîte à moustaches ? » — elle répond avec du code que vous pouvez exécuter sur votre propre data frame, en calculant les statistiques avec get_summary_stats() et en empilant la table avec ggarrange(), de sorte que la figure est reproductible. The runtime is the judge. Ask Prova →

Problèmes courants

  • La table résumée est absente ou vide. summaries = doit nommer des colonnes que get_summary_stats() produit effectivement — utilisez les minuscules "n", "median", "iqr", "mean", "sd". Une faute de frappe ou une statistique absente du type choisi donne une bande vide.
  • Les colonnes de la table ne s’alignent pas sous les boîtes. Quand vous construisez à la main, utilisez ggarrange(..., align = "v") pour que le graphique et ggsummarytable() partagent la même échelle en x ; sans cela les colonnes dérivent.
  • get_summary_stats() résume l’ensemble des données, en ignorant les groupes. Il ne groupe que si vous le lui dites — enveloppez les données dans group_by(df, dose) (ou passez la variable de groupement) avant de l’appeler.
  • La bande de table affiche encore les axes et les lignes de grille. Ajoutez clean_table_theme() à la ggsummarytable() pour qu’elle se lise comme une légende plutôt que comme un second graphique.
  • x doit être un facteur. Si les groupes sortent en nombres ou dans le mauvais ordre, exécutez df$dose <- factor(df$dose) d’abord.

Questions fréquentes

Le plus rapide est ggsummarystats() de ggpubr : ggsummarystats(ToothGrowth, x = "dose", y = "len", ggfunc = ggboxplot, summaries = c("n", "median", "iqr")) dessine une boîte à moustaches avec une table de taille d’échantillon, médiane et IQR alignée sous chaque groupe. Pour la construire à la main, calculez les statistiques avec rstatix::get_summary_stats(), transformez-les en bande avec ggsummarytable(), et empilez les deux avec ggarrange(plot, table, ncol = 1, align = "v").

Utilisez rstatix::get_summary_stats() : get_summary_stats(group_by(df, dose), len, type = "common") renvoie une table structurée avec n, min, max, médiane, IQR, moyenne, sd, se et ci par groupe. Choisissez les colonnes avec type = ("common", "mean_sd", "median_iqr", "full"). Le desc_statby() de ggpubr renvoie le même genre de table avec les colonnes moyenne/sd/se/ci qu’utilisent ses graphiques.

ggsummarystats() est le tout-en-un : il dessine le graphique et la table résumée alignée ensemble en un seul appel. ggsummarytable() dessine seulement la table — une bande de chiffres, une colonne par groupe en x — que vous combinez ensuite avec votre propre graphique à l’aide de ggarrange(). Utilisez ggsummarystats() pour la figure rapide et ggsummarytable() quand vous voulez un contrôle total sur le graphique et la table séparément.

Passez-les à summaries =, p. ex. summaries = c("n", "median", "iqr") ou c("n", "mean", "sd"). Les noms doivent correspondre aux colonnes que get_summary_stats() produit (en minuscules : n, mean, sd, median, iqr, se, ci, …). L’ordre dans lequel vous les listez est l’ordre des lignes dans la bande de table.

Oui — ggsummarystats() fonctionne avec n’importe lequel des traceurs principaux de ggpubr. Réglez ggfunc = ggviolin, ggbarplot ou ggline (au lieu de ggboxplot) et la table résumée alignée est dessinée sous les mêmes groupes en x. Les arguments supplémentaires comme add = c("mean_se", "jitter"), color et palette sont transmis directement à la fonction de tracé choisie.

Testez vos connaissances

Complétez l’appel pour que chaque dose montre une boîte à moustaches de la longueur des dents avec des points dispersés, sur une table résumée de n, médiane et IQR.

# ggfunc names the plot function (no quotes): ggboxplot
# summaries is a character vector of stat columns: c("n", "median", "iqr")
library(ggpubr) df <- ToothGrowth df$dose <- factor(df$dose) ggsummarystats( df, x = "dose", y = "len", ggfunc = ggboxplot, add = "jitter", summaries = c("n", "median", "iqr") )
library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

ggsummarystats(
  df, x = "dose", y = "len",
  ggfunc = ggboxplot, add = "jitter",
  summaries = c("n", "median", "iqr")
)

Vérification conceptuelle. Vous voulez montrer numériquement la dispersion des données, et non la précision de la moyenne. Quelle colonne mettez-vous dans summariessd ou se — et pourquoi ? (Réponse : sd. L’écart-type décrit la variabilité des observations ; l’erreur standard diminue avec la taille d’échantillon et décrit avec quelle précision la moyenne est estimée.)

Conclusion

Vous avez ajouté des statistiques résumées à un graphique à la manière de ggpubr : calculez-les avec rstatix::get_summary_stats() (ou desc_statby()), dessinez le graphique-plus-table tout-en-un avec ggsummarystats() — en choisissant le graphique via ggfunc et les colonnes via summaries — et, quand il vous faut un contrôle total, construisez la recette à la main avec ggsummarytable() + clean_table_theme() empilés sous le graphique par ggarrange(..., align = "v"). Le même schéma se facette en figures multipanneaux, chaque panneau portant sa propre table.

Pour une table autonome et entièrement stylisée — cellules colorées, thèmes personnalisés, une table en tant que figure — voir la leçon ggtexttable. Pour annoter ces comparaisons avec des tests, continuez avec Ajouter des p-values.

Leçons connexes

Vous préférez un livre ? R Graphics 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 ggpubr — 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 = {Statistiques résumées sur un graphique en R (ggpubr)},
  date = {2026-06-22},
  url = {https://www.datanovia.com/learn/data-visualization/ggpubr/summary-stats-labels},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Statistiques résumées sur un graphique en R (ggpubr).” 2026. June 22. https://www.datanovia.com/learn/data-visualization/ggpubr/summary-stats-labels.