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()
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()
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
xest une variable numérique, il s'ajuste avecscale_x_continuous(). - Si l'axe
yest une variable numérique, il s'ajuste avecscale_y_continuous(). - Si l'axe
xest une variable catégorielle, il s'ajuste avecscale_x_discrete(). - Si l'axe
yest une variable catégorielle, il s'ajuste avecscale_y_discrete(). - Si
colorest une variable catégorielle, elle s'ajuste avecscale_color_continuous(). - Si
colorest une variable catégorielle, elle s'ajuste avecscale_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)
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))
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))
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"))
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"))
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")
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")
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())
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))
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")
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)
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()
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")
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")

É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"))
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()