Tracer un tableau depuis un data frame en R (ggpubr)

Rendez un data frame sous forme de tableau graphique, stylisez-le avec ttheme(), colorez les cellules conditionnellement et placez-le à côté d’un graphique

Tracez un tableau graphique depuis un data frame en R avec ggtexttable() de ggpubr. Stylisez-le avec ttheme(), colorez et mettez en forme des cellules individuelles conditionnellement avec table_cell_bg() et table_cell_font(), et combinez le tableau avec un graphique grâce à ggarrange(). Chaque exemple est rendu pour vous et s’exécute en direct dans votre navigateur.

Date de publication

22 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • ggtexttable() transforme un data frame en tableau graphique que vous pouvez tracer, combiner avec des graphiques et exporter comme n’importe quel ggplot — ggtexttable(df, rows = NULL, theme = ttheme("light")).
  • ttheme() stylise tout le tableau en une fois : choisissez un thème nommé ("default", "light", "classic", "minimal", "blank", ou des variantes colorées comme "mOrange", "mBlue").
  • Colorez des cellules individuelles à la main ou selon une règle avec table_cell_bg() (arrière-plan) et table_cell_font() (couleur, style et taille du texte) — passez l’indice de ligne et de colonne de la cellule.
  • Construisez le tableau récapitulatif lui-même avec R de base ou avec desc_statby() de ggpubr — sans tableur, sans copier-coller.
  • Placez le tableau à côté ou sous un graphique avec ggarrange(), ou déposez-le à l’intérieur d’un graphique avec annotation_custom() — une figure-avec-tableau en un seul appel.
  • rows = NULL masque la colonne des numéros de ligne ; le tableau hérite automatiquement de l’allure soignée de la marque.
Obtenez le livre — R Graphics Essentials (PDF)

Introduction

Parfois, la chose la plus claire à montrer à côté d’un graphique, ce sont les chiffres eux-mêmes — un petit tableau des moyennes de groupes, le résultat d’un test statistique, un dictionnaire de données. R n’a aucun moyen intégré de placer un data frame dans un graphique : par() et le traçage de base ne le font pas. Le package ggpubr résout cela avec ggtexttable(), qui rend un data frame sous forme de tableau graphique — un véritable objet ggplot que vous pouvez thématiser, colorer cellule par cellule, disposer à côté d’un graphique et exporter en PDF ou PNG.

Cette leçon couvre tout le flux de travail sur les données intégrées ToothGrowth :

  • ggtexttable() — tracer un data frame sous forme de tableau.
  • ttheme() — styliser tout le tableau avec un seul thème nommé.
  • table_cell_bg() / table_cell_font() — colorer et styliser des cellules individuelles, y compris conditionnellement (par exemple signaler en vert les p-values significatives).
  • ggarrange() — combiner le tableau avec un graphique en une seule figure.

Chaque tableau ci-dessous est rendu ici même, et vous pouvez réexécuter ou modifier n’importe lequel d’entre eux en direct.

Besoin d’abord du résumé des données ? desc_statby() de ggpubr renvoie un data frame structuré des moyennes de groupes, SD, SE et IC — voir Moyennes et barres d’erreur. Ici, nous injectons ce résumé directement dans un tableau.

Construire un petit tableau récapitulatif

Un tableau graphique ne vaut que par le data frame qui le sous-tend. Nous voulons une ligne par groupe avec quelques statistiques, pas les 60 lignes brutes de ToothGrowth. Construisez le résumé dans le bloc avec aggregate() de R de base afin que le tableau ait des colonnes propres et arrondies à rendre.

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

# One row per dose x supplement: mean and SD of tooth length
stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))
stats
  dose supp mean  sd
1  0.5   OJ 13.2 4.5
2    1   OJ 22.7 3.9
3    2   OJ 26.1 2.7
4  0.5   VC  8.0 2.7
5    1   VC 16.8 2.5
6    2   VC 26.1 4.8

Vous préférez un résumé prêt à l’emploi ? desc_statby(ToothGrowth, measure.var = "len", grps = "dose") (ggpubr) renvoie la moyenne, SD, SE et IC en un seul appel — injectez n’importe quel data frame de votre choix dans ggtexttable().

Tracer le data frame sous forme de tableau

ggtexttable() prend le data frame et renvoie un tableau graphique. Passez rows = NULL pour supprimer la colonne des numéros de ligne, et choisissez une allure avec theme = ttheme(...). C’est le tableau que la plupart des gens viennent chercher — un rendu propre et prêt pour la figure d’un petit data frame.

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

stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))

ggtexttable(stats, rows = NULL, theme = ttheme("light"))

A ggpubr graphical table of mean and SD tooth length for each dose and supplement, rendered with a light journal theme and no row-number column.

Le résultat est un objet ggplot ordinaire : affectez-le à une variable, tracez-le, ou combinez-le avec d’autres graphiques plus loin dans cette leçon.

Styliser tout le tableau avec ttheme()

ttheme() stylise chaque cellule en une fois. Passez un thème nommé pour changer toute l’allure en un seul argument — du dépouillé ("blank", "minimal") au coloré façon revue ("mOrange", "mBlue", "mGreen"). Le thème "classic" dessine l’allure encadrée familière des sorties statistiques.

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

stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))

ggtexttable(stats, rows = NULL, theme = ttheme("classic"))

The same ggpubr summary table rendered with the classic theme, drawn as a boxed grid with a bold header row.

Un thème coloré fait ressortir l’en-tête — pratique quand le tableau se trouve à côté d’un graphique dans un panneau de figure.

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

stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))

ggtexttable(stats, rows = NULL, theme = ttheme("mOrange"))

The same ggpubr summary table rendered with the mOrange theme, giving the header row an orange fill.

Les thèmes nommés préfixés m ("mOrange", "mBlue", "mGreen", "mRed", …) sont la famille colorée « moyenne » ; leurs frères en "l"/"d" ("lBlue", "dBlue") sont plus clairs/plus foncés. Choisissez celui qui correspond à la palette du graphique avec lequel vous le disposerez.

Colorer des cellules individuelles conditionnellement

La vraie puissance de ggtexttable() est de styliser une cellule à la fois — pour signaler une p-value significative, un maximum, ou un groupe d’intérêt. table_cell_bg() définit l’arrière-plan d’une cellule et table_cell_font() son texte. Toutes deux prennent l’indice de row et de column de la cellule cible.

La règle d’indiçage importe : la ligne 1 est l’en-tête, donc la première ligne de données est la ligne 2. Les colonnes sont comptées à partir de 1 (avec rows = NULL, la colonne 1 est votre première colonne de données).

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

stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))

# Which data row holds the largest mean? (+1 for the header row)
top <- which.max(stats$mean) + 1
mean_col <- which(colnames(stats) == "mean")

tab <- ggtexttable(stats, rows = NULL, theme = ttheme("light"))
tab <- table_cell_bg(tab, row = top, column = mean_col,
                     fill = "#d5f5e3", color = "white")
tab <- table_cell_font(tab, row = top, column = mean_col,
                       face = "bold", color = "#1e8449")
tab

A ggpubr summary table with a single highlighted cell: the largest mean value is given a light-green background and bold text.

Pour colorer des cellules selon une règle sur tout le tableau, bouclez sur les lignes de données et choisissez un remplissage par ligne. Ici, nous signalons chaque groupe dont la moyenne dépasse 20 — exactement le motif que vous utiliseriez pour mettre en évidence les p-values significatives dans un tableau de résultats.

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

stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))

# A fill per data row, decided by a rule
stats$fill <- ifelse(stats$mean > 20, "#abebc6", "#eaecee")
mean_col <- which(colnames(stats) == "mean")

tab <- ggtexttable(stats[, c("dose", "supp", "mean", "sd")],
                   rows = NULL, theme = ttheme("light"))
for (i in seq_len(nrow(stats))) {
  tab <- table_cell_bg(tab, row = i + 1, column = mean_col,
                       fill = stats$fill[i], color = "white")
}
tab

A ggpubr summary table where every row with a mean above 20 has a green-filled mean cell and the rest are grey, applied conditionally in a loop.

C’est le motif FAQ migré, ré-écrit : construisez le tableau, décidez d’une couleur par ligne à partir des données, puis bouclez table_cell_bg() sur row = i + 1. Changez la règle (p.adj < 0.01, mean == max(mean), un nom de groupe) et vous pouvez signaler tout ce que la figure doit mettre en avant.

Combiner le tableau avec un graphique

Parce qu’un ggtexttable() est un ggplot, vous pouvez le placer à côté ou sous un graphique avec ggarrange() — la façon ggpubr standard de construire une figure multi-panneaux. Ici, la boîte à moustaches et son tableau récapitulatif s’empilent en une seule figure.

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

# The chart
bxp <- ggboxplot(df, x = "dose", y = "len",
                 color = "dose", palette = "jco",
                 xlab = "Dose (mg)", ylab = "Tooth length")

# The summary table beneath it
stats <- aggregate(len ~ dose, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(dose = stats$dose,
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))
tab <- ggtexttable(stats, rows = NULL, theme = ttheme("light"))

# Arrange chart + table into one figure
ggarrange(bxp, tab, ncol = 1, nrow = 2, heights = c(1, 0.4))

A two-panel ggpubr figure: a box plot of tooth length by dose on top and its summary table of means and SDs underneath, combined with ggarrange().

Vous voulez le tableau à l’intérieur de la zone de tracé plutôt qu’en dessous ? Enveloppez-le avec ggplotGrob() et ajoutez-le avec annotation_custom(ggplotGrob(tab), xmin = ..., ymin = ...) (ggplot2), en plaçant le grob du tableau aux coordonnées de données à l’intérieur du graphique.

Essayez en direct

Les tableaux 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 le ttheme() par "classic" ou "mBlue", de changer la règle de mise en évidence, ou de disposer le tableau à côté d’un autre graphique.

Vous travaillez en Python ? Un guide de rendu de tableau pandas/matplotlib arrive dans la série Python.

🟢 Avec un agent IA

Demandez à Prova « comment rendre mon propre data frame sous forme de tableau et colorer les cellules qui satisfont une règle ? » — elle répond avec du code ggtexttable() + table_cell_bg() que vous pouvez exécuter sur votre propre data frame, de sorte que le tableau stylisé soit reproductible. The runtime is the judge. Ask Prova →

Problèmes courants

  • La mauvaise cellule est colorée (décalage de un). row = 1 est l’en-tête, donc la première ligne de données est row = 2. Quand vous bouclez, visez row = i + 1. Obtenez la colonne avec which(colnames(df) == "mean") plutôt qu’en comptant à l’œil.
  • Une colonne de numéros de ligne apparaît à gauche. Passez rows = NULL à ggtexttable() pour la masquer ; le comportement par défaut dessine les noms de lignes du data frame comme première colonne.
  • Les nombres s’affichent avec de longues décimales. ggtexttable() dessine le data frame tel quel — appliquez round() aux colonnes numériques quand vous construisez le résumé, ou format(), avant de tracer.
  • Le tableau paraît à l’étroit à côté du graphique dans ggarrange(). Ajustez les tailles de panneaux avec heights = c(1, 0.4) (ou widths pour une disposition côte à côte) afin que le tableau ne domine pas le graphique.

Questions fréquentes

Utilisez ggtexttable() de ggpubr : ggtexttable(df, rows = NULL, theme = ttheme("light")) rend n’importe quel data frame sous forme de tableau graphique. Le résultat est un objet ggplot, donc vous pouvez le tracer, le combiner avec des graphiques via ggarrange(), et l’exporter en PNG ou PDF avec ggexport() ou ggsave().

Utilisez table_cell_bg() pour l’arrière-plan et table_cell_font() pour le texte, en passant l’indice de row et de column de la cellule : table_cell_bg(tab, row = 2, column = 3, fill = "lightgreen"). Rappelez-vous que row = 1 est l’en-tête, donc la première ligne de données est row = 2. Trouvez une colonne par son nom avec which(colnames(df) == "mean").

Décidez d’un remplissage par ligne à partir des données (par exemple ifelse(df$p.adj < 0.01, "green", "gray")), puis bouclez table_cell_bg() sur les lignes, en visant row = i + 1 pour sauter l’en-tête. C’est le motif standard pour signaler en vert les p-values significatives ou les valeurs maximales dans un tableau de résultats.

Passez un thème nommé à l’argument theme : ttheme("light"), "classic", "minimal", "blank", ou une famille colorée comme "mOrange", "mBlue", "mGreen". ttheme() stylise chaque cellule en un seul appel ; n’utilisez table_cell_bg() / table_cell_font() ensuite que pour les cellules individuelles que vous voulez redéfinir.

Tous deux sont des objets ggplot, donc combinez-les avec ggarrange() : ggarrange(plot, table, ncol = 1, nrow = 2, heights = c(1, 0.4)) empile le graphique au-dessus du tableau. Utilisez ncol = 2 avec widths pour une disposition côte à côte, ou annotation_custom(ggplotGrob(table)) pour déposer le tableau à l’intérieur de la zone de tracé.

Testez vos connaissances

Complétez le code pour que la cellule de la plus grande mean du tableau reçoive un arrière-plan vert clair. La ligne de données avec la plus grande moyenne est trouvée pour vous — complétez l’appel à table_cell_bg() avec les bons row, column et fill.

# table_cell_bg() needs the row, the column and a fill colour:
#   row = top, column = mean_col, fill = "#d5f5e3"
library(ggpubr) df <- ToothGrowth df$dose <- factor(df$dose) stats <- aggregate(len ~ dose + supp, data = df, FUN = function(x) c(mean = mean(x), sd = sd(x))) stats <- data.frame(stats[, c("dose", "supp")], mean = round(stats$len[, "mean"], 1), sd = round(stats$len[, "sd"], 1)) top <- which.max(stats$mean) + 1 mean_col <- which(colnames(stats) == "mean") tab <- ggtexttable(stats, rows = NULL, theme = ttheme("light")) tab <- table_cell_bg(tab, row = top, column = mean_col, fill = "#d5f5e3") tab
library(ggpubr)
df <- ToothGrowth
df$dose <- factor(df$dose)

stats <- aggregate(len ~ dose + supp, data = df,
                   FUN = function(x) c(mean = mean(x), sd = sd(x)))
stats <- data.frame(stats[, c("dose", "supp")],
                    mean = round(stats$len[, "mean"], 1),
                    sd   = round(stats$len[, "sd"], 1))

top <- which.max(stats$mean) + 1
mean_col <- which(colnames(stats) == "mean")

tab <- ggtexttable(stats, rows = NULL, theme = ttheme("light"))
tab <- table_cell_bg(tab, row = top, column = mean_col, fill = "#d5f5e3")
tab

Vérification rapide : dans un ggtexttable() avec rows = NULL, quel indice row correspond à la première ligne de données ?

  • A. row = 0
  • B. row = 1
  • C. row = 2

(Réponse : Crow = 1 est l’en-tête, donc la première ligne de données est row = 2.)

Conclusion

Vous avez rendu un data frame sous forme de tableau graphique prêt pour publication à la manière de ggpubr : ggtexttable() le dessine, ttheme() stylise tout le tableau en un seul argument, et table_cell_bg() / table_cell_font() colorent des cellules individuelles — y compris conditionnellement, en bouclant une règle pilotée par les données sur les lignes (la façon standard de signaler les valeurs significatives). Parce que le tableau n’est qu’un ggplot, ggarrange() le combine avec un graphique en une seule figure, et ggexport() l’écrit en PDF ou PNG.

Pour calculer le résumé derrière le tableau, voir Moyennes et barres d’erreur et desc_statby() ; pour placer des chiffres récapitulatifs directement sur un graphique plutôt que dans un tableau, voir Étiquettes de statistiques résumées.

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 = {Tracer un tableau depuis un data frame en R (ggpubr)},
  date = {2026-06-22},
  url = {https://www.datanovia.com/learn/data-visualization/ggpubr/ggtexttable},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Tracer un tableau depuis un data frame en R (ggpubr).” 2026. June 22. https://www.datanovia.com/learn/data-visualization/ggpubr/ggtexttable.