Facettes ggplot2 en R : graphiques multi-panneaux

Découpez un ggplot en une matrice de panneaux avec facet_wrap() et facet_grid() — en direct dans votre navigateur

Apprenez à créer des facettes d’un graphique ggplot2 en R — découpez-le en petits multiples avec facet_wrap() et facet_grid(), libérez les échelles des panneaux et personnalisez les étiquettes et l’arrière-plan des bandeaux. Modifiez et exécutez le code en direct, sans installation.

Date de publication

20 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Les facettes découpent un graphique en une matrice de panneaux — des petits multiples — afin que chaque sous-groupe ait sa propre vue sur une échelle partagée.
  • Utilisez facet_wrap(~ var) pour répartir les panneaux d’une variable dans une grille ; contrôlez la forme avec ncol / nrow.
  • Utilisez facet_grid(rows ~ cols) pour disposer les panneaux selon deux variables — var ~ . pour les lignes, . ~ var pour les colonnes.
  • Laissez les panneaux se redimensionner indépendamment avec scales = "free", "free_x" ou "free_y" ; la valeur par défaut est fixe (idéale pour la comparaison).
  • Renommez les étiquettes des bandeaux avec labeller = label_both ou un vecteur nommé labeller().
  • Mettez en forme les bandeaux avec theme(strip.text = ..., strip.background = ...) et ajoutez de l’espace entre les panneaux avec panel.spacing.
  • Chaque graphique ci-dessous est généré pour vous — modifiez ensuite n’importe quel exemple en direct dans le bac à sable.
Obtenez le livre — GGPlot2 Essentials (PDF)

Introduction

Les facettes sont la façon dont ggplot2 transforme un graphique surchargé en une grille soignée de petits multiples : au lieu d’entasser chaque sous-groupe dans un seul panneau, vous donnez à chacun son propre panneau sur une échelle partagée, de sorte que les motifs ressortent et que la comparaison reste honnête. En R, ggplot2 propose deux couches de facettes — facet_wrap() pour une variable et facet_grid() pour une ou deux — ainsi qu’un contrôle complet des échelles des panneaux et des étiquettes des bandeaux. Cette leçon les construit pas à pas ; les figures sont générées ici même, et vous pouvez réexécuter ou modifier chacune d’elles en direct.

Nous utilisons le jeu de données intégré ToothGrowth : la longueur des cellules odontoblastes (len) chez des cochons d’Inde recevant 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). Créer des facettes par supp et dose est une façon naturelle de voir comment chaque combinaison se comporte.

facet_grid() avec une variable : lignes ou colonnes

facet_grid() dispose les panneaux sur une grille définie par une formule, rows ~ cols. Placez l’espace réservé . du côté que vous ne voulez pas découper. Utilisez supp ~ . pour empiler les panneaux en lignes, et . ~ supp pour les étaler en colonnes.

library(ggplot2)
ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_grid(supp ~ .) +
  labs(x = "Dose (mg/day)", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot of tooth length by dose, faceted into two rows by supplement (OJ and VC).

Remplacez la formule par . ~ supp pour disposer les mêmes panneaux côte à côte en colonnes à la place :

library(ggplot2)
ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_grid(. ~ supp) +
  labs(x = "Dose (mg/day)", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot of tooth length by dose, faceted into two columns by supplement (OJ and VC).

facet_grid() avec deux variables

Nommez une variable de chaque côté du ~ pour construire une véritable grille à deux dimensions : supp ~ dose donne une ligne par supplément et une colonne par dose. Inversez l’ordre en dose ~ supp et les lignes et colonnes s’échangent.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_grid(supp ~ dose) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot of tooth length faceted into a grid: supplement on rows, dose on columns.

facet_wrap() : répartir les panneaux dans une grille

Lorsque vous créez des facettes selon une variable sans vous soucier d’une signification stricte de ligne/colonne, facet_wrap() fait circuler les panneaux dans une grille compacte et passe automatiquement à la ligne suivante. Contrôlez sa forme avec ncol ou nrow.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose, ncol = 3) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot of tooth length by supplement, faceted into three columns by dose with facet_wrap.

Échelles de panneaux libres : libres ou fixes

Par défaut, chaque panneau partage un même jeu d’axes, ce qui rend la comparaison entre panneaux équitable. Définissez scales = "free_y" pour laisser l’axe des y de chaque panneau s’étendre à ses propres données, "free_x" pour l’axe des x, ou "free" pour les deux. N’utilisez les échelles libres que lorsque la forme de chaque panneau importe plus que la comparaison absolue.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose, scales = "free_y") +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot of tooth length faceted by dose, each panel with its own free y-axis scale.

Modifier les étiquettes des bandeaux avec label_both

Par défaut, le bandeau affiche seulement le niveau (0.5, 1, 2). Passez labeller = label_both pour afficher le nom de la variable à côté de chaque valeur — pratique lorsqu’un simple nombre est ambigu.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose, labeller = label_both) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot faceted by dose with strip labels reading 'dose: 0.5', 'dose: 1', 'dose: 2'.

Étiquettes de bandeaux personnalisées avec un labeller nommé

Pour définir vous-même le texte du bandeau, passez à labeller() un vecteur de caractères nommé qui associe chaque niveau à une nouvelle étiquette. Les noms doivent correspondre exactement aux niveaux du facteur. (Renommer les niveaux du facteur sous-jacent avec labels = fonctionnerait aussi, mais l’approche labeller() laisse vos données intactes.)

library(ggplot2)
dose_labels <- c("0.5" = "D0.5", "1" = "D1", "2" = "D2")
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose, labeller = labeller(dose = dose_labels)) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot faceted by dose with custom strip labels D0.5, D1 and D2.

Mettre en forme le texte du bandeau

L’étiquette du bandeau est un élément de thème. Modifiez sa police, sa taille et sa couleur via theme(strip.text = element_text(...)) — utile lorsque vous voulez faire ressortir les en-têtes des panneaux.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal() +
  theme(strip.text = element_text(face = "bold", size = 12, colour = "#1f3a5f"))

ggplot2 box plot faceted by dose with bold, larger, dark-blue strip label text.

Mettre en forme l’arrière-plan du bandeau

Utilisez le thème strip.background pour contrôler le rectangle situé derrière chaque étiquette de bandeau — remplissage, contour et bordure — avec element_rect().

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal() +
  theme(
    strip.background = element_rect(fill = "#dce9f7", colour = "grey60"),
    strip.text = element_text(colour = "#1f3a5f")
  )

ggplot2 box plot faceted by dose with a light-blue strip background rectangle behind each label.

Ajouter un panneau marginal avec margins

Dans facet_grid(), margins = TRUE ajoute un panneau « (all) » supplémentaire qui regroupe les données sur l’ensemble de la variable de facette — un moyen rapide de voir chaque sous-groupe et l’image combinée dans une seule figure.

library(ggplot2)
ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_grid(. ~ supp, margins = TRUE) +
  labs(x = "Dose (mg/day)", y = "Tooth length") +
  theme_minimal()

ggplot2 box plot faceted by supplement columns with an extra '(all)' marginal panel pooling both supplements.

Espace entre les panneaux

Lorsque les étiquettes ou les axes semblent serrés, élargissez les espaces entre les panneaux avec panel.spacing (une unit). Vous pouvez aussi élargir une seule direction avec panel.spacing.x ou panel.spacing.y.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_wrap(~ dose, ncol = 3) +
  labs(x = "Supplement", y = "Tooth length") +
  theme_minimal() +
  theme(panel.spacing = unit(1.5, "lines"))

ggplot2 box plot faceted by dose into three columns with extra horizontal space between the panels.

Colorer les panneaux par groupe

Les facettes et la couleur sont indépendantes — vous pouvez toujours associer une variable à fill à l’intérieur de chaque panneau. Utilisez une palette adaptée au daltonisme comme viridis pour que la figure reste lisible pour tout le monde. Pour l’ensemble complet des contrôles de palette et de couleur, consultez le guide des couleurs ggplot2.

library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len, fill = supp)) +
  geom_boxplot() +
  facet_wrap(~ dose) +
  scale_fill_viridis_d() +
  labs(x = "Supplement", y = "Tooth length", fill = "Supplement") +
  theme_minimal()

ggplot2 box plot faceted by dose, the boxes filled by supplement with a colourblind-safe viridis palette.

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 de petits multiples avec matplotlib/seaborn arrive dans la série Python.

🟢 Avec un agent IA

Demandez à Prova « dois-je utiliser facet_grid ou facet_wrap pour deux variables ici ? » — elle répond avec du code que vous pouvez exécuter, de sorte que l’explication est reproductible. The runtime is the judge. Demander à Prova →

Questions fréquentes

facet_wrap(~ var) fait circuler les panneaux d’une variable dans une grille compacte et passe à la ligne suivante, vous lui donnez donc sa forme avec ncol / nrow. facet_grid(rows ~ cols) dispose les panneaux sur une grille fixe définie par une ou deux variables, où chaque ligne et chaque colonne a une signification fixe.

Nommez une variable de chaque côté du ~ dans facet_grid() — par exemple facet_grid(supp ~ dose) place une ligne par supp et une colonne par dose. L’inverser en facet_grid(dose ~ supp) échange les lignes et les colonnes.

Ajoutez scales = "free_y" à votre couche de facettes, par exemple facet_wrap(~ dose, scales = "free_y"). Utilisez "free_x" pour l’axe des x ou "free" pour les deux ; la valeur par défaut est une échelle fixe, ce qui garde la comparaison entre panneaux équitable.

Pour des étiquettes avec le nom de la variable comme dose: 1, passez labeller = label_both. Pour définir votre propre texte, donnez à labeller() un vecteur nommé dont les noms correspondent exactement aux niveaux du facteur, par exemple labeller(dose = c("0.5" = "D0.5", "1" = "D1", "2" = "D2")).

Les bandeaux sont des éléments de thème : définissez strip.background = element_rect(fill = "#dce9f7", colour = "grey60") pour recolorer le rectangle, et strip.text = element_text(face = "bold", size = 12, colour = "#1f3a5f") pour modifier la police de l’étiquette, le tout à l’intérieur de theme().

Testez vos connaissances

Complétez le code pour que le graphique soit découpé en une seule ligne de panneaux, un par dose.

# Use facet_grid() with dose on the columns side: . ~ dose
library(ggplot2) ggplot(ToothGrowth, aes(x = supp, y = len)) + geom_boxplot(fill = "#3a86d4", alpha = 0.7) + facet_grid(. ~ dose)
library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len)) +
  geom_boxplot(fill = "#3a86d4", alpha = 0.7) +
  facet_grid(. ~ dose)

Conclusion

Vous avez découpé un graphique ggplot2 en petits multiples avec facet_wrap() et facet_grid(), disposé les panneaux selon une ou deux variables, libéré les échelles des panneaux, renommé les bandeaux avec label_both et un labeller() personnalisé, mis en forme le texte et l’arrière-plan des bandeaux, ajouté un panneau marginal, et élargi l’espacement des panneaux. Ensuite, explorez la boîte à moustaches que vous avez découpée ici, et le reste de la grammaire 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 = {Facettes ggplot2 en R : graphiques multi-panneaux},
  date = {2026-06-20},
  url = {https://www.datanovia.com/learn/data-visualization/ggplot2/facets},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Facettes ggplot2 en R : graphiques multi-panneaux.” 2026. June 20. https://www.datanovia.com/learn/data-visualization/ggplot2/facets.