Facets (sous-graphiques)

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 ~ .)
Nuage de points de hwy en fonction de displ réparti en sept sous-graphiques, un par catégorie de véhicule de mpg, sur trois colonnes avec des axes communs

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 dans facet_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)
Nuage de points de hwy en fonction de displ avec un petit sous-graphique pour chaque valeur de displ, de nombreux sous-graphiques comportant peu de points

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)
Nuage de points de hwy en fonction de displ réparti par catégorie de véhicule et disposé sur deux colonnes avec facet_wrap et 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)
Nuage de points de hwy en fonction de displ réparti par catégorie de véhicule et disposé sur deux lignes avec facet_wrap et 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)
Grille de nuages de points de hwy en fonction de displ avec le nombre de cylindres (4, 5, 6, 8) en lignes et la catégorie de véhicule en colonnes

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")
Nuage de points de hwy en fonction de displ où les catégories de véhicule sont empilées en lignes les unes sous les autres, créé avec facet_grid(class ~ .)
Nuage de points de hwy en fonction de displ où les catégories de véhicule sont placées côte à côte sur une ligne, créé avec facet_grid(. ~ class)

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)
Grille de nuages de points de hwy en fonction de displ avec des lignes pour les combinaisons de cylindres et de transmission et des colonnes pour la catégorie de véhicule

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"
             )
Nuage de points de hwy en fonction de displ par catégorie de véhicule sur deux colonnes, avec des échelles d'axes libres et les titres des sous-graphiques à gauche

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.