Les variables catégorielles peuvent être représentées à l'aide de facets dans ggplot2. Une facet est un graphique qui correspond à un sous-groupe du jeu de données. Pour créer des facets, on dispose des fonctions facet_wrap() et facet_grid(). La première (facet_wrap()) sert à créer des facets à partir d'une seule variable. La seconde (facet_grid()) sert à créer des facets à partir de deux variables ou plus. Les variables à utiliser comme facets sont indiquées après le caractère tilde (~). Dans ce contexte, le terme facet désigne chacun des graphiques individuels. Chaque facet représente un sous-groupe des données et peut donc être considérée comme un sous-graphique. D'un point de vue technique, les facets ne doivent pas être confondues avec les panneaux abordés au chapitre suivant.
Facet Wrap : facet_wrap()
Dans la figure ci-dessous, facet_wrap() est utilisée avec la colonne class (qui indique la catégorie de véhicule à laquelle appartient la voiture). On devrait ainsi obtenir un graphique distinct pour chaque catégorie de véhicule.
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=3) +
facet_wrap(class ~ .)
Dans la figure ci-dessus, on remarque que :
- Tous les sous-graphiques (panneaux) partagent la même échelle sur l'axe des x et l'axe des y.
- Le titre de chaque sous-graphique correspond à l'une des modalités de la variable catégorielle (
class) utilisée dansfacet_wrap().
Les facets fonctionnent aussi avec des variables numériques (numeric) ou entières (integer), comme le montre l'exemple ci-dessous où la colonne displ (numérique) est utilisée comme facet. Il est toutefois rarement pertinent de créer des facets à partir d'une variable continue. Les variables continues prennent souvent de nombreuses valeurs, si bien que certains sous-graphiques risquent de ne contenir que peu de points, voire aucun.
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=1) +
facet_wrap(~ displ)
La fonction facet_wrap() possède les arguments nrow et ncol, qui déterminent le nombre de lignes et de colonnes utilisées. Dans l'exemple suivant, nous indiquons que les sous-graphiques doivent être affichés sur deux colonnes :
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point() +
facet_wrap(~ class, ncol=2)
Dans l'exemple suivant, nous indiquons que les sous-graphiques doivent être affichés sur deux lignes :
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=2) +
facet_wrap(~ class, nrow=2)
Facet Grid : facet_grid()
Pour utiliser deux variables comme facets, on emploie la fonction facet_grid(). Les variables sont alors séparées par un tilde. Avant le ~, on indique la variable placée en lignes et, après le ~, la variable qui constitue les colonnes, comme dans l'exemple suivant :
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=1.5) +
facet_grid(cyl ~ class)
Vous pouvez placer un point (.) de part ou d'autre du tilde (~) pour déterminer si les sous-graphiques doivent être affichés en ligne ou en colonne. Si le . est placé avant le ~, les sous-graphiques s'affichent en colonne, et inversement :
## Présentation des sous-graphiques en ligne
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=1.5) +
facet_grid(. ~ class) +
labs(title="Punkt innan ~ resulterar i radvis presentation")
## Présentation des sous-graphiques en colonne
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=1.5) +
facet_grid(class ~ .) +
labs(title="Punkt efter ~ resulterar i kolumnvis presentation")

La fonction facet_grid() accepte deux variables de part et d'autre du tilde (~), ce qui permet d'observer des tendances dans des sous-groupes supplémentaires. Voici un exemple dans lequel les panneaux en lignes sont stratifiés sur deux variables (cyl et drv) :
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=1.5) +
facet_grid(cyl + drv ~ class)
Fonctions de facet_wrap()
L'ensemble des arguments de facet_wrap() est présenté ci-dessous.
facet_wrap(
facets,
nrow = NULL,
ncol = NULL,
scales = "fixed",
shrink = TRUE,
labeller = "label_value",
as.table = TRUE,
switch = deprecated(),
drop = TRUE,
dir = "h",
strip.position = "top"
)Utilisez la commande ?facet_grid() pour obtenir la description de chaque argument. Les explications sont faciles à comprendre pour facet_grid() comme pour facet_wrap(). Créons un graphique dans lequel les échelles de l'axe des x et de l'axe des y sont libres et optimisées automatiquement, et où le titre de chaque sous-graphique est placé à gauche du graphique :
ggplot(data=mpg, aes(x = displ,
y = hwy)) +
geom_point(size=1.5) +
facet_wrap(~ class,
# Nombre de colonnes
ncol=2,
# Laisse libres les échelles de l'axe des x et de l'axe des y
scales="free",
# Le titre du sous-graphique est placé à gauche
strip.position = "left"
)
Fonctions de facet_grid()
facet_grid(
rows = NULL,
cols = NULL,
scales = "fixed",
space = "fixed",
shrink = TRUE,
labeller = "label_value",
as.table = TRUE,
switch = NULL,
drop = TRUE,
margins = FALSE,
facets = NULL
)Facets vs. Panels (sous-graphiques vs. panneaux)
Les facets ne doivent pas être confondues avec les panneaux d'une figure. Dans une figure à facets, les sous-graphiques correspondent à des sous-groupes des données. Dans une figure à panneaux, les sous-graphiques peuvent provenir de jeux de données entièrement différents. Les figures composées de plusieurs panneaux se créent avec d'autres packages. Les plus utilisés sont cowplot et gridExtra, présentés au chapitre suivant.