Les légendes avec graphics de R

Marges et légendes avec R

Le package graphics de R (l'outil graphique qui est inclus dans R de base) n’est pas l’outil idéal pour placer une légende. Mais qu’importe, voyons ici quelques astuces...

 

Exemple

Nous partirons d’un diagramme en boîte. Celui-ci a été réalisé en page de fonction boxplot(). Nous ne reprendrons ni les données ni la construction du graphique. Celui-ci apparaît ainsi :

légende sur le tracé

Le pavé de la légende est très mal placé puisqu’il empiète sur le graphe. Mais avant de modifier son emplacement, reprenons son script pour l’expliquer.

legend("topright",
legend = c("Janvier", "Février", "Moyenne"),
fill = c("lightblue", "pink", NA),
border = c("darkblue", "darkred", NA),
pch = c(NA, NA, 19),
col = c(NA, NA, "black"))

"topright" signifie bien sûr que l’emplacement se situe en haut et à droite.

Remarquez ensuite que chaque argument est vectorisé. Le premier concerne les séries.

Puis fill precise les couleurs des pavés de la légende. Aucun remplissage pour le point, donc NA. Celui-ci est un cas particulier puisque c’est un indicateur commun aux deux séries. De même, border indique les couleurs des bordures des pavés. Il est important de savoir que la fonction legend() de graphics ne récupère rien : il faut tout préciser, y compris les couleurs utilisées pour réaliser le graphique ! Si on trouve ça un peu lourd, on peut toujours stocker les couleurs dans des objets ou… utiliser le package ggplot2.

pch donne le style de point (voir la page plot()). Quant à col, c’est la couleur des symboles, en l’occurrence des points (pch), mais dans un autre exemple elle pourrait être celle des lignes.

 

Marges

Voyons comment modifier les marges avec graphics. Le but peut être l’insertion d’une légende ou d’un texte.

Exemple (agrandissement de la marge droite) :

par(mar = c(5, 4, 4, 7)) # bas, gauche, haut, droite

par() est une fonction dont le nom vient de parameters. Elle sert à lire ou modifier les paramètres graphiques globaux. Autrement dit, elle règle le contexte dans lequel les graphiques sont tracés. Ses effets restent actifs jusqu’à ce qu’on les change.

par(mar = c(5, 4, 4, 7)) signifie : pour le graphique suivant, les marges seront…

L’unité de mesure est la ligne de texte. C’est donc une unité relative, qui dépend de la taille des caractères et du périphérique graphique (sinon, on peut utiliser mai qui est la marge en pouces).

Ainsi par(mar = c(10, 4, 4, 2)) laisse une énorme marge en bas, utile pour des axes inclinés, des commentaires, etc.

 

Légende hors du graphe

Il ne nous reste plus qu’à positionner la légende dans la marge. Reprenons l’intégralité du script (après l'étape d'importation).

# Extraire les deux séries de prix
prix1 <- data$prix_1
prix2 <- data$prix_2

# Agrandir la marge droite
par(mar = c(3, 4, 4, 7))  # bas, gauche, haut, droite

# Tracer les box-plots avec couleurs
boxplot(prix1, prix2,
names = c("Janvier", "Février"),
col = c("lightblue", "pink"),
border = c("darkblue", "darkred"),
main = "Ventes de janvier et février",
ylab = "Prix")

# Ajouter la moyenne sous forme de point
points(1, mean(prix1, na.rm = TRUE), pch = 19, col = "darkblue")
points(2, mean(prix2, na.rm = TRUE), pch = 19, col = "darkred")

# Ajouter une grille
abline(h = axTicks(2), col = "gray80", lty = "dotted")

# Légende hors du graphique
legend("topright",
inset = c(-0.25, 0),
legend = c("Prix 1", "Prix 2"),
fill = c("lightblue", "pink"),
border = c("blue", "red"),
xpd = TRUE)

Pour alléger la présentation, nous avons supprimé les points dans la légende.

légende en haut à droite

xpd = TRUE autorise à placer la légende dans la marge et inset = c(-0.25, 0) décale la légende vers la droite de \(25\%\) de la largeur de la zone de tracé (et de 0 en vertical). À moins d’avoir une bonne pratique, on doit donc tâtonner pour trouver l’emplacement souhaité !

Autre exemple d’emplacement :

par(mar = c(7, 4, 4, 2))
(…)
legend("bottom",
inset = c(0, -0.4),
legend = c("Prix 1", "Prix 2"),
fill = c("lightblue", "pink"),
horiz = TRUE,
xpd = TRUE)

légende en bas

 

légende