Thèmes (themes)

Pour ajuster le thème et la mise en page, on dispose de la fonction theme(), qui possède une longue série d'arguments permettant d'agir sur pratiquement tous les aspects de la mise en page et du thème. Il existe en outre des thèmes prêts à l'emploi, comme theme_bw(), qui confèrent au graphique un style particulier. Utiliser un thème prêt à l'emploi (par exemple theme_bw()) implique en général qu'il faut effectuer moins d'ajustements manuels.

Ajuster le thème n'est pas nécessaire pour l'exploration des données. Il convient en revanche de le faire lors de la présentation, afin d'optimiser le résultat final. La plupart des professionnels travaillent avec un petit nombre de types de visualisations ; il est donc judicieux d'investir du temps dans l'élaboration de thèmes adaptés.

Dans ce chapitre, nous travaillons avec les données gapminder, disponibles dans le package du même nom. Chargez gapminder avec le code suivant :

library(gapminder)

## Inspecter les 5 premières lignes
head(gapminder)
country <fctr> continent <fctr> year <int> lifeExp <dbl> pop <int> gdpPercap <dbl>
Afghanistan Asia 1952 28.801 8425333 779.4453
Afghanistan Asia 1957 30.332 9240934 820.8530
Afghanistan Asia 1962 31.997 10267083 853.1007
Afghanistan Asia 1967 34.020 11537966 836.1971
Afghanistan Asia 1972 36.088 13079460 739.9811
Afghanistan Asia 1977 38.438 14880372 786.1134

Gapminder

Nous commençons par un graphique sans aucun ajustement du thème (notez que nous prenons le logarithme de pop et de lifeExp afin que le graphique soit plus lisible) :

ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression, thème par défaut à fond gris

Nous allons maintenant modifier ce thème en présentant 8 thèmes complets. Pour écrire un code efficace, nous allons donc créer un objet (base_plot) contenant le graphique ci-dessus :

base_plot <- ggplot(gapminder, aes(x=log(pop),
                      y=log(lifeExp))) +
  geom_point(aes(color = continent)) +
  geom_smooth()

Nous ajoutons maintenant des thèmes à base_plot. Nous ajoutons également un titre afin que le graphique indique quel thème a été utilisé (voir ci-dessous).

base_plot +
  labs(title="Theme Background White (theme_bw)") +
  theme_bw()

base_plot +
  labs(title="Theme Classic (theme_classic)") +
  theme_classic()

base_plot +
  labs(title="Theme Minimal (theme_minimal)") +
  theme_minimal()

base_plot +
  labs(title="Theme Grey (theme_grey)") +
  theme_minimal()

base_plot +
  labs(title="Theme Linedraw (theme_linedraw)") +
  theme_linedraw()

base_plot +
  labs(title="Theme Dark (theme_dark)") +
  theme_dark()

base_plot
  labs(title="Theme Light (theme_light)") +
  theme_light()

base_plot +
  labs(title="Theme Void (theme_void)") +
  theme_void()
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_void, sans axes ni quadrillage
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_light avec quadrillage gris clair
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_dark avec panneau gris foncé
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_linedraw avec cadre noir et quadrillage
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression, titre Theme Grey, fond blanc et quadrillage clair
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_minimal, fond blanc sans cadre
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_classic avec lignes d'axes sans quadrillage
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression en theme_bw, fond blanc et cadre noir

Ggthemes

Le package ggthemes (https://jrnold.github.io/ggthemes/) contient encore davantage de themes, scales et geoms complets pour ggplot2. ggthemes offre plus d'options que tout autre package existant. On y trouve en outre des options spécialement conçues pour la recherche, la publication scientifique, le daltonisme, des revues spécifiques, des applications, etc. Installez le package avec la commande suivante :

install.packages("ggthemes")
library(ggthemes)

Essayons un thème prêt à l'emploi inspiré du Wall Street Journal :

base_plot +
  labs(title="Theme Wall Street Journal") +
  theme_wsj()
Nuage de points des données gapminder en theme_wsj de ggthemes avec fond beige, lignes pointillées et légende en haut

Ajuster des éléments spécifiques

Tous les exemples ci-dessus étaient des thèmes prêts à l'emploi qui modifient de nombreux éléments simultanément. Vous pouvez modifier pratiquement tous les éléments du thème à l'aide de theme(). Cette fonction accepte un grand nombre d'éléments qui disposent de fonctions d'éléments. Par exemple, l'élément title sert à ajuster tous les titres. Comme les titres sont du texte, leur fonction d'élément est element_text(). Dans element_text(), nous pouvons par exemple modifier la taille et la couleur des titres avec le code suivant :

title = element_text(size=12, color="purple")

Dans le graphique, cela donne ceci :

base_plot +
theme(title = element_text(size=15, color="gold1"))
Nuage de points de log(lifeExp) en fonction de log(pop), coloré par continent, avec courbe de régression, où les titres des axes et le titre de la légende sont jaunes et plus grands
Voici une liste des éléments de theme(), suivie d'une image montrant les éléments les plus courants et leurs fonctions d'éléments.
theme(
  line,
  rect,
  text,
  title,
  aspect.ratio,
  axis.title,
  axis.title.x,
  axis.title.x.top,
  axis.title.x.bottom,
  axis.title.y,
  axis.title.y.left,
  axis.title.y.right,
  axis.text,
  axis.text.x,
  axis.text.x.top,
  axis.text.x.bottom,
  axis.text.y,
  axis.text.y.left,
  axis.text.y.right,
  axis.ticks,
  axis.ticks.x,
  axis.ticks.x.top,
  axis.ticks.x.bottom,
  axis.ticks.y,
  axis.ticks.y.left,
  axis.ticks.y.right,
  axis.ticks.length,
  axis.ticks.length.x,
  axis.ticks.length.x.top,
  axis.ticks.length.x.bottom,
  axis.ticks.length.y,
  axis.ticks.length.y.left,
  axis.ticks.length.y.right,
  axis.line,
  axis.line.x,
  axis.line.x.top,
  axis.line.x.bottom,
  axis.line.y,
  axis.line.y.left,
  axis.line.y.right,
  legend.background,
  legend.margin,
  legend.spacing,
  legend.spacing.x,
  legend.spacing.y,
  legend.key,
  legend.key.size,
  legend.key.height,
  legend.key.width,
  legend.text,
  legend.text.align,
  legend.title,
  legend.title.align,
  legend.position,
  legend.direction,
  legend.justification,
  legend.box,
  legend.box.just,
  legend.box.margin,
  legend.box.background,
  legend.box.spacing,
  panel.background,
  panel.border,
  panel.spacing,
  panel.spacing.x,
  panel.spacing.y,
  panel.grid,
  panel.grid.major,
  panel.grid.minor,
  panel.grid.major.x,
  panel.grid.major.y,
  panel.grid.minor.x,
  panel.grid.minor.y,
  panel.ontop,
  plot.background,
  plot.title,
  plot.title.position,
  plot.subtitle,
  plot.caption,
  plot.caption.position,
  plot.tag,
  plot.tag.position,
  plot.margin,
  strip.background,
  strip.background.x,
  strip.background.y,
  strip.clip,
  strip.placement,
  strip.text,
  strip.text.x,
  strip.text.y,
  strip.switch.pad.grid,
  strip.switch.pad.wrap,
)

Fonctions d'éléments :

Vue d'ensemble des éléments de thème de ggplot2 avec des flèches vers les éléments des axes, du graphique, des facettes et de la légende, et leurs fonctions d'éléments

Ci-dessous, nous créons une figure avec des étiquettes (labs()) pour x, y et titel ; de nouvelles échelles pour x et y ; ainsi que l'ajustement d'un certain nombre d'éléments de theme().

base_plot +
  # Modifie les étiquettes de x, y et du titre
  labs(x="Population",
       y="Life expectancy (years)",
       title="Life expectancy and population size") +

  # Modifie l'échelle de l'axe des x et de l'axe des y
  scale_y_continuous(breaks=seq(3, 5, by=0.5),
                     limits=c(2, 5)) +
  scale_x_continuous(breaks=seq(10, 20, by=1),
                     limits=c(10, 20)) +

  # Ajuste le thème
  theme(legend.text = element_text(color="brown4"),
        legend.title = element_blank(),
        legend.key = element_blank(),
        panel.grid.major.x=element_line(color = "lightgoldenrod3",
                                        size = 0.5,
                                        linetype = 2),
        panel.grid.minor.x=element_line(color = "palevioletred3",
                                        size = 0.5,
                                        linetype = 2),
        plot.background = element_rect(fill="wheat3"))
Nuage de points de l'espérance de vie en fonction de la population avec fond beige, quadrillage en tirets de deux couleurs et textes de légende marron