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.
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 <- ToothGrowthdf$dose <-factor(df$dose)# tidy summary of len within each doseget_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 <- ToothGrowthdf$dose <-factor(df$dose)# group means, sd, se and ci by dosedesc_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 <- ToothGrowthdf$dose <-factor(df$dose)ggsummarystats( df, x ="dose", y ="len",ggfunc = ggboxplot, add ="jitter",summaries =c("n", "median", "iqr"))
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 <- ToothGrowthdf$dose <-factor(df$dose)ggsummarystats( df, x ="dose", y ="len",ggfunc = ggboxplot, add ="jitter",color ="dose", palette ="npg",summaries =c("n", "median", "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 <- ToothGrowthdf$dose <-factor(df$dose)ggsummarystats( df, x ="dose", y ="len",ggfunc = ggviolin, add =c("jitter", "median_iqr"),summaries =c("n", "median", "iqr"))
Passez à un diagramme en barres de moyennes en nommant simplement ggfunc = ggbarplot (ou ggline pour une courbe) :
library(ggpubr)df <- ToothGrowthdf$dose <-factor(df$dose)ggsummarystats( df, x ="dose", y ="len",ggfunc = ggbarplot, add =c("mean_se", "jitter"),summaries =c("n", "mean", "sd"))
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 <- ToothGrowthdf$dose <-factor(df$dose)ggsummarystats( df, x ="dose", y ="len",ggfunc = ggboxplot, add ="jitter",color ="supp", palette ="npg",summaries =c("n", "median", "iqr"))
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.
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 <- ToothGrowthdf$dose <-factor(df$dose)# 1. compute the statistics with rstatixsummary_stats <-get_summary_stats(group_by(df, dose), len, type ="common")summary_stats <- summary_stats[, c("dose", "n", "median", "iqr")]# 2a. the main plotbxp <-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 stripsummary_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 heightggarrange( bxp, summary_plot,ncol =1, align ="v",heights =c(0.80, 0.20))
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
NoteComment ajouter une table de statistiques résumées à un graphique en R ?
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").
NoteComment calculer les statistiques résumées de groupes (n, moyenne, médiane, IQR) en R ?
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.
NoteQuelle est la différence entre ggsummarystats() et ggsummarytable() ?
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.
NoteComment choisir quelles statistiques apparaissent sous le graphique ?
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.
NotePuis-je aussi ajouter une table résumée à un violon, des barres ou une courbe ?
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
ImportantExercice : une boîte à moustaches avec une table résumée en dessous
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 <- ToothGrowthdf$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 summaries — sd 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.
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 = {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}
}