Échelles, axes et légendes (guides)

Dans ggplot2, des fonctions automatiques optimisent les échelles de l'axe x, de l'axe y, de color, de fill et des légendes (angl. figure legends). En ajustant les échelles, nous pouvons modifier l'apparence de l'axe des x et de l'axe des y. Les échelles servent également à modifier le contenu des légendes. Autrement dit, les échelles permettent de modifier à la fois les axes et les légendes. Ensemble, les axes et les légendes constituent les guides du graphique.

Dans ce chapitre, nous utiliserons les données de l'enquête mpg. Assurez-vous que tidyverse est chargé, ce qui a pour effet de charger également ggplot2 et mpg :

library(tidyverse)

## Inspecter les 5 premières lignes de mpg
head(mpg)
manufacturer <chr> model <chr> displ <dbl> year <int> cyl <int> trans <chr> drv <chr> cty <int> hwy <int> fl <chr>
audi a4 1.8 1999 4 auto(l5) f 18 29 p
audi a4 1.8 1999 4 manual(m5) f 21 29 p
audi a4 2.0 2008 4 manual(m6) f 20 31 p
audi a4 2.0 2008 4 auto(av) f 21 30 p
audi a4 2.8 1999 6 auto(l5) f 16 26 p
audi a4 2.8 1999 6 manual(m5) f 18 26 p

Données mpg.

Dans l'exemple suivant, nous créons un graphique avec un axe x, un axe y et un codage couleur (color) fondé sur la colonne class :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point()
Nuage de points de la consommation sur autoroute (hwy) en fonction de la cylindrée (displ) dans mpg, coloré selon la catégorie de véhicule (class)

Le graphique ci-dessus montre que ggplot() a automatiquement créé une échelle pour l'axe des x, une pour l'axe des y et une pour les couleurs des points. ggplot() le fait au moyen des fonctions scale_x_continuous(), scale_y_continuous() et scale_colour_discrete(). Nous n'avons pas besoin de spécifier ces fonctions dans le code ci-dessus, car ggplot() s'en charge automatiquement. Si nous ajoutons ces fonctions, nous obtenons un graphique identique :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous() +
  scale_y_continuous() +
  scale_colour_discrete()
Même nuage de points de hwy en fonction de displ coloré selon la catégorie de véhicule, tracé avec les échelles par défaut spécifiées explicitement

Ces fonctions et leurs noms s'interprètent comme suit :

Fonction Explication
scale_x_continuous() Modifie un axe des x continu (numérique). Dans l'exemple ci-dessus, c'est l'échelle de displ qui est modifiée.
scale_x_continuous() Modifie un axe des y continu (numérique). Dans l'exemple ci-dessus, c'est l'échelle de hwy qui est modifiée.
scale_colour_discrete Modifie l'argument colour (color) lorsqu'il s'agit d'une variable discrète. Dans l'exemple ci-dessus, c'est l'échelle de class qui est modifiée.

Les autres fonctions scale s'utilisent de la même manière et suivent le même principe de dénomination :

  • Si l'axe x est une variable numérique, il s'ajuste avec scale_x_continuous().
  • Si l'axe y est une variable numérique, il s'ajuste avec scale_y_continuous().
  • Si l'axe x est une variable catégorielle, il s'ajuste avec scale_x_discrete().
  • Si l'axe y est une variable catégorielle, il s'ajuste avec scale_y_discrete().
  • Si color est une variable catégorielle, elle s'ajuste avec scale_color_continuous().
  • Si color est une variable catégorielle, elle s'ajuste avec scale_color_discrete().

Guides : axes et légendes

Les guides du graphique sont constitués de l'échelle des axes (x, y) et des légendes. Les axes et les légendes se modifient avec les arguments suivants :

  • breaks : modifie les valeurs affichées sur un axe, ou les catégories affichées dans une légende.
  • labels : modifie les étiquettes affichées sur un axe ou dans une légende.
  • limits : modifie l'intervalle couvert par les axes.

Axes (x, y)

Nous reprenons le graphique précédent, dont nous supprimons maintenant l'échelle de l'axe des x et de l'axe des y. Pour cela, nous déclarons breaks=NULL, comme suit :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = NULL) +
  scale_y_continuous(breaks = NULL)
Nuage de points de hwy en fonction de displ dont les graduations, les valeurs d'échelle et le quadrillage des axes x et y ont été supprimés

Dans la première figure, nous avons vu que l'axe des x va de 2 à 7 par intervalles de 1,0. Nous modifions l'échelle pour qu'elle aille de 2 à 7 par intervalles de 0,5. Pour cela, breaks reçoit une séquence (créée avec la fonction seq()) de 2 à 7 avec un pas de 0,5, comme suit :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(from=2, to=7, by=0.5))
Nuage de points de hwy en fonction de displ dont l'axe des x comporte des graduations espacées de 0,5 unité de 2,0 à 7,0

Dans l'exemple suivant, nous élargissons les limites de l'axe des x de 0 à 15 :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(from=2, to=7, by=.5),
                     limits = c(0, 10))
Nuage de points de hwy en fonction de displ dont les limites de l'axe des x sont élargies, de sorte que les points se regroupent au centre de la figure

Dans l'exemple suivant, nous limitons l'axe des x à l'intervalle 1 à 5 et remplaçons les valeurs numériques par de nouvelles étiquettes, à savoir les cinq premières lettres de l'alphabet :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1, 5, by=1),
                     limits = c(1, 5),
                     labels = c("A", "B", "C", "D", "E"))
Nuage de points de hwy en fonction de displ dont les valeurs de l'axe des x ont été remplacées par les étiquettes A à E

Légendes (legends)

Comme indiqué plus haut, breaks et limits agissent également sur les légendes. La légende elle-même est créée à partir de la correspondance esthétique (aesthetic mapping). Dans l'exemple ci-dessous, nous utilisons color=class dans aes(). Pour modifier cette échelle, nous utilisons la fonction scale_color_discrete(). Nous indiquons que breaks ne contient que "pickup" et que cette catégorie reçoit l'étiquette "Pickup car".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_color_discrete(breaks=c("pickup"),
                       labels=c("Pickup car"))
Nuage de points de hwy en fonction de displ coloré selon la catégorie de véhicule, dont la légende n'affiche qu'une seule catégorie avec l'étiquette Pickup car

De la même manière, il est possible d'ajuster l'ordre des éléments de la légende.

Position de la légende (figure legends)

L'emplacement de la légende n'influe pas sur les données présentées dans le graphique. Ce type de composant s'ajuste avec theme(). La légende peut être placée n'importe où dans la figure. Voici plusieurs exemples d'ajustement de sa position.

Dans le premier exemple, nous supprimons la légende avec l'argument legend.position = "none".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(legend.position = "none")
Nuage de points de hwy en fonction de displ coloré selon la catégorie de véhicule, dont la légende a été entièrement supprimée

L'argument legend.position accepte également les valeurs "bottom", "top", "right" et "left". Nous l'illustrons ici avec "bottom" :

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(legend.position = "bottom")
Nuage de points de hwy en fonction de displ coloré selon la catégorie de véhicule, avec la légende placée sous le graphique sur deux lignes

Les autres emplacements possibles au moyen de chaînes de caractères sont les suivants :

  • theme(legend.position = "top")
  • theme(legend.position = "bottom")
  • theme(legend.position = "left")
  • theme(legend.position = "right")

Vous pouvez aussi positionner la légende à l'aide de coordonnées, l'axe des x comme l'axe des y allant de 0 à 1. Pour placer la légende en bas à droite, les coordonnées sont x=1 et y=0, indiquées dans un vecteur numérique (c(1, 1)).

Vous pouvez aussi positionner la légende à l'aide de coordonnées, l'axe des x comme l'axe des y allant de 0 à 1. Pour placer la légende en haut à droite, les coordonnées sont x=1 et y=1, indiquées dans un vecteur numérique (c(1, 1)). Dans theme(), la légende dispose d'arguments supplémentaires (legend.justification, legend.margin, etc.) que nous utiliserons également ci-dessous pour optimiser sa position. Le code contient des commentaires qui expliquent le rôle de chaque argument.

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  theme(
    # La légende est placée tout en haut à droite
    legend.position = c(1, 1),

    # La légende ne peut pas dépasser les limites du graphique
    legend.justification = c("right", "top"),

    # Margin crée une marge entre la légende et son environnement.
    # Une marge de 10 mm est appliquée sur les 4 bords
    legend.margin = margin(10, 10, 10, 10),

    # Le fond est supprimé en le spécifiant comme un élément vide
    legend.background = element_blank())
Nuage de points de hwy en fonction de displ avec la légende placée à l'intérieur du coin supérieur droit du graphique
Avec guides(), il est possible d'ajuster individuellement chaque légende d'une figure. Ajustons ci-dessus la position et l'apparence de la légende des constructeurs automobiles (manufacturer). Pour cela, nous modifions le nombre de lignes (nrow) sur lesquelles la légende est présentée, ainsi que la taille (size) des symboles de la légende.
ggplot(mpg, aes(x=displ,
                y=hwy,
                color=manufacturer,
                shape=drv)) +
  geom_point(size=3) +

  # Placer les légendes au-dessus du graphique
  theme(legend.position = "top") +

  # Modifie chaque légende individuellement
  guides(colour = guide_legend(nrow = 3, #nombre de lignes
                               override.aes = list(size = 4), # taille des symboles de la légende
                               order = 2), # ordre d'affichage
         shape = guide_legend(nrow = 3,
                              override.aes = list(size = 4),
                              order = 1))
Nuage de points de hwy en fonction de displ, avec la couleur selon le constructeur et la forme selon le type de transmission, légendes placées au-dessus sur trois lignes

Nous pouvons utiliser guides() pour masquer une légende en particulier. Ci-dessous, nous masquons la légende des formes (shapes) et remplaçons le titre de la légende des couleurs (color) par "Biltillverkare".

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=manufacturer,
                shape=drv)) +
  geom_point() +
  theme(legend.position = "top") +
  guides(colour = guide_legend(title="Biltillverkare",
                               nrow = 3,
                               override.aes = list(size = 5)),
         # Masquer la légende de shape
         shape = "none")
Nuage de points de hwy en fonction de displ où seule la légende des constructeurs est affichée, avec le titre Biltillverkare et des symboles plus grands

Remplacer ou transformer une échelle

Une échelle numérique peut être transformée afin de mieux mettre en évidence les relations présentes dans les données. Dans l'exemple suivant, nous utilisons les données gapminder pour visualiser la corrélation entre la taille de la population (pop) et l'espérance de vie (lifeExp). Nous le faisons avec et sans transformation logarithmique des axes. Pour placer les figures côte à côte, nous assignons les objets ggplot() à deux nouveaux objets (plot_1, plot_2), que nous utilisons ensuite dans plot_grid() du package cowplot.

library(gapminder)

## Sans logarithme
plot_1 <- ggplot(gapminder, aes(x=pop,
                                y=lifeExp,
                                color=year)) +
  geom_point() +
  labs(title="Utan logaritmerade axlar") +
  theme(legend.position = "bottom")

## Avec logarithme
plot_2 <- ggplot(gapminder, aes(x=pop,
                                y=lifeExp,
                                color=year)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10() +
  labs(title="Med logaritmerade axlar") +
  theme(legend.position = "bottom")

library(cowplot)
plot_grid(plot_1, plot_2)
Deux nuages de points de l'espérance de vie en fonction de la population dans gapminder, respectivement sans et avec axes logarithmiques

Modifier l'échelle de couleurs et la palette

R Colorbrewer

Les échelles servent également à colorer les variables discrètes. ggplot comporte des palettes de couleurs intégrées dont les couleurs ont été choisies avec soin. Il existe en outre d'autres palettes destinées à des usages plus spécifiques. Il existe par exemple R ColorBrewer, qui regroupe un ensemble de palettes particulièrement adaptées aux personnes daltoniennes. Pour afficher toutes les palettes de R ColorBrewer, saisissez la commande suivante :

RColorBrewer::display.brewer.all()
Vue d'ensemble de toutes les palettes ColorBrewer dans R : échelles de couleurs séquentielles, qualitatives et divergentes

Vous pouvez utiliser ces palettes dans ggplot au moyen de la fonction scale_color_brewer(). Comme le montre la figure ci-dessus, il existe une palette appelée "Set3". Ci-dessous, nous utilisons "Set3" dans scale_color_brewer().

ggplot(mpg, aes(x=displ,
                y=hwy,
                color=class)) +
  geom_point() +
  scale_color_brewer(palette = "Set1")
Nuage de points de hwy en fonction de displ où les catégories de véhicules sont colorées avec une palette ColorBrewer qualitative

Vous trouverez plus d'informations sur ColorBrewer sur https://colorbrewer2.org/.

Viridis

Le package viridis propose scale_color_viridis() et scale_fill_viridis(), utilisables aussi bien pour les variables continues que pour les variables discrètes. Pour les variables continues, viridis est préférable à ColorBrewer.

library(viridis)

## Couleurs par défaut de viridis
ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_color_viridis_c()

## Viridis plasma
ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_color_viridis_c(option = "plasma")
Nuage de points de l'espérance de vie en fonction de la population, les points étant colorés selon l'année avec l'échelle continue viridis
Nuage de points de l'espérance de vie en fonction de la population, les points étant colorés selon l'année avec la palette viridis plasma

Échelles de couleurs manuelles

Si les palettes intégrées et celles de packages comme viridis ne conviennent pas, vous pouvez créer la palette manuellement. Cela se fait avec scale_colour_manual() ou scale_fill_manual(). Voici un exemple dans lequel scale_colour_manual() est utilisée pour définir manuellement les couleurs des voitures en fonction de class.

ggplot(gapminder, aes(x=pop,
                y=lifeExp,
                color=continent)) +
  geom_point() +
    scale_colour_manual(values = c(Africa="darkblue",
                                   Asia="pink",
                                   Europe="green",
                                   Oceania="purple",
                                   Americas="cyan"))
Nuage de points de l'espérance de vie en fonction de la population avec des couleurs choisies manuellement pour chaque continent

Les fonctions scale_fill_gradient2() et scale_colour_gradient2() permettent d'attribuer aux variables continues un dégradé de couleurs avec un point médian. Dans l'exemple ci-dessous, scale_colour_gradient2() est utilisée pour colorer en noir les points postérieurs à 1980 et en jaune les points antérieurs à 1980, avec dans les deux cas un dégradé à partir de 1980. Notez que les axes sont également logarithmiques.

ggplot(gapminder, aes(x=pop,
                      y=lifeExp,
                      color=year)) +
  geom_point() +
  scale_colour_gradient2(midpoint=1980,
                         high = "black",
                         low = "gold") +
  scale_x_log10() +
  scale_y_log10()
Nuage de points de l'espérance de vie en fonction de la population (logarithmique) avec un dégradé de couleurs à trois niveaux selon l'année, du jaune au noir en passant par le blanc