Mappage esthétique

En chargeant tidyverse, vous avez également obtenu l'accès à un data frame appelé mpg, abréviation de miles per gallon. Il contient des données sur la consommation de carburant de voitures et se prête bien aux exercices ci-dessous. Ces données ont été recueillies par l'US EPA (Environmental Protection Agency) et portent sur 38 modèles de voitures différents (https://fueleconomy.gov/).

Si tidyverse n'est pas encore installé, installez-le avec la commande suivante :

install.packages("tidyverse")

Chargez tidyverse :

library(tidyverse)

Affichez les premières lignes des données :

mpg
manufacturer model displ year cyl trans drv cty hwy fl
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
audi a4 3.1 2008 6 auto(av) f 18 27 p
audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 p
audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 p
audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 p

Premières lignes de mpg.

Les données mpg

Les données mpg comptent 234 lignes et les 11 variables suivantes :

  • manufacturer : manufacturer name
  • model : model name
  • displ : engine displacement, in litres
  • year : year of manufacture
  • cyl : number of cylinders
  • trans : type of transmission
  • drv : the type of drive train, where f = front-wheel drive, r = rear wheel drive, 4 = 4wd
  • cty : city miles per gallon
  • hwy : highway miles per gallon
  • fl : fuel type
  • class : "type" of car

Pour que le code des exercices ci-dessous reste concis, nous ne spécifierons aucun libellé avec labs() avant que le graphique soit terminé. Dans l'exemple ci-dessous, nous créons un graphique avec ggplot(). Dans ggplot(), nous indiquons que les données proviennent de mpg et nous utilisons aes() pour associer displ à l'axe des x et hwy à l'axe des y. Nous ajoutons ensuite geom_point(), qui représente les valeurs de x et y par des points. Il n'est pas nécessaire d'indiquer le mappage esthétique (aes()) dans geom_point(), car il est automatiquement hérité de ggplot().

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point()
Nuage de points des données mpg avec la cylindrée du moteur (displ) en abscisse et l'efficacité énergétique (hwy) en ordonnée, points noirs

Vous venez de découvrir toute la beauté de ggplot(), à savoir la possibilité de construire un graphique par couches. Le graphique ci-dessus ne comporte qu'une seule couche, geom_point().

Mappage esthétique (aesthetic mapping)

En construisant un graphique par couches, nous pouvons contrôler les données affichées dans chaque couche. Dans le graphique suivant, nous créons des points distincts pour les voitures dont la consommation est supérieure ou inférieure à la moyenne de consommation de carburant (hwy). Notez que nous ne spécifions pas aes() dans ggplot(), mais dans chaque geom_point().

## Calculer la moyenne de la consommation de carburant (hwy)
median_hwy <- median(mpg$hwy)

## Créer le graphique
ggplot() +
  # Voitures dont la consommation est supérieure ou égale à la médiane
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Voitures dont la consommation est inférieure à la médiane
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2)
Nuage de points de displ en fonction de hwy où les voitures situées au-dessus de la médiane de hwy ou sur celle-ci sont en jaune et celles situées en dessous en bleu-vert

Nous ajoutons ensuite une ligne horizontale qui indique la position de la moyenne sur l'axe des y. Cela se fait avec geom_hline() à la ligne 16.

## Calculer la moyenne de la consommation de carburant (hwy)
median_hwy <- median(mpg$hwy)

## Créer le graphique
ggplot() +
  # Pour les voitures dont la consommation est supérieure ou égale à la médiane
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Pour les voitures dont la consommation est inférieure à la médiane
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy)
Même nuage de points avec des points jaunes et bleu-vert ainsi qu'une ligne horizontale noire à la médiane de hwy, 24

Nous poursuivons en ajoutant un texte (avec geom_label()) qui affiche la valeur médiane sur la ligne horizontale. Le texte doit être placé tout à gauche sur l'axe des x et à la hauteur de la médiane sur l'axe des y. La fonction geom_label() possède l'argument label, qui correspond au texte à afficher sur le graphique ; dans le cas présent, il s'agit tout simplement de la valeur médiane (ligne 17). Notez ci-dessous que nous indiquons « tout à gauche » sur l'axe des x en écrivant x=-Inf (negative infinity). Pour placer un élément tout à droite sur l'axe des x, on indique au contraire x=Inf. Ainsi, nous n'avons pas besoin d'identifier nous-mêmes la plus petite et la plus grande valeur de l'axe des x.

## Calculer la moyenne de la consommation de carburant (hwy)
median_hwy <- median(mpg$hwy)

## Créer le graphique
ggplot() +
  # Pour les voitures dont la consommation est supérieure ou égale à la médiane
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Pour les voitures dont la consommation est inférieure à la médiane
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy) +
  geom_label(aes(x=-Inf, y=median_hwy), label=median_hwy)
Nuage de points avec ligne médiane où l'étiquette portant la valeur médiane dépasse en partie du bord gauche du graphique

Justification horizontale et verticale (hjust, vjust)

Malheureusement, une partie de l'étiquette s'est retrouvée en dehors du graphique, comme le montre la figure ci-dessus. Heureusement, la plupart des geom() disposent aussi des arguments hjust et vjust, qui permettent de décaler un élément (par exemple un point de données ou une étiquette) horizontalement ou verticalement. Au début, il peut être un peu difficile de comprendre comment hjust et vjust décalent les éléments, mais l'aide-mémoire suivant facilite grandement les choses :

Aide-mémoire montrant comment la position du texte par rapport à un point change avec hjust et vjust égaux à 0, 0,5 et 1

Il ressort de ce qui précède que hjust=0 et vjust=0.5 devraient décaler l'étiquette vers la droite sur l'axe des x. Essayons (ligne 17) :

## Calculer la moyenne de la consommation de carburant (hwy)
median_hwy <- median(mpg$hwy)

## Créer le graphique
ggplot() +
  # Pour les voitures dont la consommation est supérieure ou égale à la médiane
  geom_point(data = filter(mpg, hwy>=median_hwy),
             aes(x = displ, y = hwy),
             color="gold1",
             size=2) +
  # Pour les voitures dont la consommation est inférieure à la médiane
  geom_point(data = filter(mpg, hwy<median_hwy),
             aes(x = displ, y = hwy),
             color="cyan4",
             size=2) +
  geom_hline(yintercept=median_hwy) +
  geom_label(aes(x=-Inf, y=median_hwy), label=median_hwy, hjust=0, vjust=0.5)
Nuage de points avec ligne médiane où l'étiquette 24 apparaît désormais entièrement à l'intérieur du graphique, près du bord gauche

Nous modifions maintenant le code pour que le mappage esthétique (aes()) se fasse dans ggplot(). mpg contient la colonne class, qui indique le type de voiture. Nous voulons utiliser class pour colorer les points de données. Pour cela, nous indiquons color=class dans aes(). L'objectif est d'examiner s'il existe une association entre la catégorie à laquelle appartient la voiture et la consommation de carburant (mwy).

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class)) +
  geom_point()

## Vous pouvez écrire « color » ou « colour », les deux variantes sont acceptées
Nuage de points de displ en fonction de hwy où les points sont colorés selon la catégorie de voiture (class), avec une légende à droite

Le mappage esthétique dans aes() s'applique donc à tous les points de données. Dans l'exemple ci-dessus, nous avons indiqué que les points de données devaient recevoir une couleur propre à chaque niveau de la colonne class. La signification des couleurs est indiquée à droite de la figure. Notez que la légende de droite porte le titre « class », qui est la colonne spécifiée dans color.

Nous continuons à modifier le graphique en y ajoutant des informations supplémentaires. Nous souhaitons maintenant que la taille de chaque point de données soit fonction du nombre de cylindres du moteur. Nous associons alors la variable cyl au paramètre size dans aes() :

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     size=cyl)) +
  geom_point()
Nuage de points de displ en fonction de hwy, avec la couleur selon la catégorie de voiture et la taille des points selon le nombre de cylindres (cyl)

Il semble exister une forte association entre le nombre de cylindres et la taille du moteur (displ) ainsi que la consommation de carburant (hwy). Les voitures à faible consommation ont un petit moteur (displ) et moins de cylindres (cyl). Notez également qu'une échelle de tailles figure à droite du graphique et qu'elle porte le titre cyl, la variable que nous avons associée à size dans aes(). Dans ce cas, associer cyl à size convient parfaitement, car cyl est une variable numérique ordonnable.

Shape (forme) et alpha (transparence, transparency)

Dans aes(), on peut également spécifier alpha, qui contrôle la transparence des points, et shape, qui contrôle leur forme. Vous pouvez indiquer une valeur précise pour alpha (par exemple alpha=0.5 pour une transparence de 50 %) et pour shape (par exemple shape=2 pour utiliser des triangles au lieu de points). Vous pouvez aussi associer une colonne à alpha et à shape, auquel cas ggplot() effectue le mappage automatiquement. Essayons maintenant d'associer cyl à alpha :

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     size=cyl,
                     alpha=cyl)) +
  geom_point()
Nuage de points avec la couleur selon la catégorie de voiture, où la taille et la transparence dépendent toutes deux du nombre de cylindres

Notez ci-dessus que cyl sert désormais à définir à la fois la taille et la transparence des points, ce qui apparaît également dans la légende à droite du graphique. Essayons maintenant d'associer shape à cyl :

Essayons maintenant d'associer class à shape. Nous ajustons également la taille des points en indiquant size=3, comme suit :

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class,
                     shape=class)) +
  geom_point(size=3)
Nuage de points où la catégorie de voiture détermine à la fois la couleur et la forme ; la catégorie suv n'a pas de symbole, car seules six formes sont utilisées

Vous pouvez représenter tous les points avec une shape (forme) précise. Pour cela, on indique manuellement shape dans geom_point(). Il ne faut pas l'indiquer dans aes(), mais comme argument de geom_point(), comme dans l'exemple suivant où tous les points reçoivent shape=2, c'est-à-dire des triangles :

ggplot(data=mpg, aes(x = displ,
                     y = hwy,
                     color=class)) +
  geom_point(size=3, shape=2)
Nuage de points où tous les points sont des triangles vides (shape 2) colorés selon la catégorie de voiture

Vous pouvez spécifier shape, color et size en associant ces propriétés à des variables de votre data frame, ou en indiquant des valeurs précises. Les règles suivantes s'appliquent à shape, color et size :

Propriété Fonction Peut être spécifiée par une variable Peut être spécifiée manuellement
shape Modifie la forme de geom_point(). Oui. Attribue une forme distincte à chaque niveau (6 au maximum). Exemple : shape=class Oui. Exemple : shape=2
size Modifie la taille de geom_point(). Exprimée en millimètres (mm). Non. Oui, avec une valeur numérique.
color Modifie la couleur de geom_point(). Oui. Exemple : shape=class Oui, avec une chaîne de caractères ou un code HEX. Exemple de chaîne : color="blue" Exemple HEX : color="#33333"

En ce qui concerne shape, l'aide-mémoire ci-dessous présente les formes et le numéro correspondant à chacune.

Aide-mémoire des formes de points dans R numérotées de 0 à 24, notamment carré, cercle, triangle, losange et croix