10  Graphiques

R permet de créer des graphiques d’excellente qualité avec des possibilités de personnalisation infinies.

Les fonctions R de base offrent déjà de très bonnes possibilités graphiques, mais quelques packages additionnels permettent de réaliser des graphiques avec une meilleure esthétique par défaut, ou en facilitant certaines opérations. On citera notamment les packages {lattice} (Sarkar, 2008) et {ggplot2} (Wickham, 2009).

10.1 Graphiques pour une variable quantitative

10.1.1 Histogrammes

En R-base, un histogramme s’obtient avec la fonction hist().

hist(dat$FM1, main = "Longueur des fémurs",
     xlab = "Longueur", ylab = "Effectifs")
Figure 10.1: Histogramme pour la variable FM1.

Comme signalé précédemment, en présence de données structurées en groupes d’individus très différents, les représentations graphiques globales ont peu d’intérêt. Effectuer une représentation séparée pour chaque groupe est plus pertinent.

Il est parfaitement possible de réaliser de tels graphiques avec les fonctions R de base, mais il faut alors scripter pour gérer manuellement la séparation en groupes (par exemple avec split()) et la séparation de la fenêtre graphique en plusieurs panneaux.

Pour avoir accès à de telles représentations avec moins d’effort, on pourra par exemple utiliser le package {lattice}, spécialisé dans les graphiques conditionnels. En revanche, il possède sa syntaxe propre, différente des fonctions de base.

library(lattice) # charge le package
histogram(~ FM1 | Sexe, data = dat)
Figure 10.2: Histogramme pour la variable FM1 en fonction du sexe des individus (avec {lattice}).
histogram(~ FM1 | Sexe * Site, data = dat)
Figure 10.3: Histogramme pour la variable FM1 en fonction du sexe et du site des individus (avec {lattice}).

10.1.2 Estimation de densité (méthodes à noyau)

La fonction density() permet de réaliser des kernel density estimations.

kde <- density(dat$FM1, na.rm = TRUE)
plot(kde, main = "Longueur du fémur")
rug(dat$FM1) # ajoute les valeurs individuelles
Figure 10.4: Estimation de densité pour la variable FM1 (avec R-base).

Pour prendre en compte des groupes d’individus, on peut là encore utiliser le package {lattice} et sa fonction densityplot() :

densityplot(~ FM1 | Sexe, data = dat)
Figure 10.5: Estimation de densité en fonction du sexe pour la variable FM1 (avec {lattice}).

10.1.3 Boîtes de dispersion

Les boxplots (Tukey, 1977) sont une manière standard de représenter la distribution d’une variable continue.

boxplot(dat$FM1, main = "Longueur du fémur")
Figure 10.6: Boîte de dispersion pour la variable FM1 (avec R-base).
Aparté : les formules

L’aide de nombreuses fonctions R (comme celle de boxplot()) montre qu’on peut leur fournir en argument une formula. Une formule, en R, est une construction syntaxique du type Y ~ X, et signifie génériquement “Y en fonction de X”.

Remarques :

  • Y ~ X1 + X2 veut dire “Y en fonction de X1 et X2” ;
  • Y ~ X1 * X2 veut dire “Y en fonction de l’interaction de X1 et X2” (qui sont alors généralement des variables qualitatives, i.e. des facteurs).

On utilise généralement des boxplots pour représenter des différences entre plusieurs groupes :

boxplot(FM1 ~ Sexe, main = "FM1", data = dat)
Figure 10.7: Boîtes de dispersions pour la variable FM1 en fonction du sexe (avec R-base).
boxplot(FM1 ~ Sexe * Site, main = "FM1", data = dat)
Figure 10.8: Boîtes de dispersions pour la variable FM1 en fonction du sexe et du site (avec R-base).

10.2 Graphiques pour une variable qualitative

L’oeil humain étant peu sensible aux différences de secteurs angulaires, on évitera autant que possible les diagrammes en secteurs (“camemberts”), et on leur préfèrera des diagrammes en barres.

plot(dat$Orientation_corps, main = "Orientation")
Figure 10.9: Diagramme en barres pour l’orientation des corps.

10.3 Options graphiques

10.3.1 Gestion des couleurs

L’argument col permet de modifier les couleurs dans toutes les fonctions graphiques de base (consulter leur documentation pour s’en assurer). On peut ceci dit donner plusieurs types d’information à cet argument col pour indiquer les couleurs à utiliser sur le graphique.

plot(dat$Orientation_corps, main = "Orientation", col = 1:4)
Figure 10.10: Diagramme en barres pour l’orientation des corps.

Pourquoi et comment les nombres fournis à l’argument col se traduisent-ils en couleurs ? Par défaut, R débute toujours sa session avec une palette de 8 couleurs, dont on peut obtenir la liste avec :

palette()
[1] "black"   "#DF536B" "#61D04F" "#2297E6" "#28E2E5" "#CD0BBC" "#F5C710"
[8] "gray62" 

Les couleurs sont numérotées dans leur ordre d’apparition dans la palette : on peut spécifier une couleur ou bien par son nom (p. ex., col = "black"), ou bien par son numéro dans la palette de couleurs actuelle (p. ex., col = 1). Il est bien sûr possible d’augmenter le nombre de couleurs dans la palette actuelle, et/ou de les réordonner (utile pour créer des dégradés). Certaines palettes offrent des dégradés par défaut (rainbow, terrain.colors, etc.).

Pour redéfinir la palette avec des couleurs choisies arbitrairement :

palette(c("purple", "salmon", "goldenrod", "cyan"))

Pour utiliser une palette prédéfinie :

palette(rainbow(10)) # 10 couleurs en dégradé

Pour revenir à la palette par défaut :

palette("default")

Plus d’informations dans des documents en ligne :

10.3.2 Paramètres graphiques

La fonction par() permet de modifier de nombreux paramètres graphiques (cf. sa page de documentation), qui s’appliqueront généralement à la prochaine fenêtre graphique créée. Ces paramètres doivent donc être définis et exécutés avant de créer le graphique avec plot(), ou boxplot(), etc.

Pour augmenter la taille de tous les éléments :

par(cex = 1.2) # augmentation de 20 %

Pour diviser la fenêtre en une grille de 4 panneaux :

par(mfrow = c(2, 2))

Pour modifier les marges du graphique :

par(mar = c(1, 1, 1, 1)) # réduction des marges

10.4 Nuages de points

La fonction générique plot() affiche un nuage de points si on lui fournit en argument deux variables continues.

plot(FM1 ~ RM1, data = dat, pch = 1,
     main = "Un nuage de points")
Figure 10.11: Nuage de points (avec R-base).

L’argument pch permet de spécifier le type de figuré à afficher, à partir de la liste suivante.

Pour représenter des groupes sur le nuage, on peut là encore utiliser le package {lattice} :

xyplot(FM1 ~ RM1, groups = Sexe, auto.key = TRUE, data = dat)
Figure 10.12: Nuage de points conditionnel (avec {lattice}).

Remarques :

  • L’argument auto.key = TRUE permet d’afficher automatiquement une légende, déterminée à partir du facteur spécifié avec Groups. On peut personnaliser cette légende si son rendu automatique ne convient pas (cf. l’aide).

  • On peut aussi demander un graphique séparé pour les hommes et les femmes au lieu de les superposer sur le même graphiques. La même échelle est alors conservée pour les deux graphiques afin de faciliter l’interprétation :

    xyplot(FM1 ~ RM1 | Sexe, auto.key = TRUE, data = dat)
    Figure 10.13: Nuages de points conditionnel, une alternative (avec {lattice}).

Toutefois, le code suivant permet d’obtenir le même genre de graphique à l’aide de la fonction de base plot() :

## Tracé du nuage de points :
plot(FM1 ~ RM1, data = dat, pch = 16, 
     col = Sexe, main = "Nuage de points")
## Ajout manuel de la légende :
legend("topleft", pch = 16, col = 1:2,
       legend = levels(dat$Sexe))
Figure 10.14: Nuage de points conditionnel (avec R-base).

Dans cette version, faire très attention à la spécification manuelle de la légende (ne pas inverser les couleurs ou les étiquettes…).

10.5 Ajout d’éléments à des graphiques

La fonction plot() ouvre systématiquement une nouvelle fenêtre et y trace un graphique. D’autres fonctions permettent d’ajouter de nouveaux éléments sur la fenêtre graphique active :

  • abline() permet d’ajouter des droites d’équation \(y = a + bx\) ou \(x = c\) sur le graphique ;
  • points() ajoute des points de coordonnées spécifiées sur le graphique en cours ;
  • text() ajoute du texte (utile pour ajouter le nom des individus, par exemple).
plot(FM1 ~ RM1, data = dat, pch = 16)
text(x = dat$RM1, y = dat$FM1, cex = 0.7,
     labels = rownames(dat), pos = 3)
Figure 10.15: Nuage de points annoté (avec R-base).

10.6 Exporter un graphique

R peut exporter vos graphiques en de nombreux formats, vectorisés ou non (.eps, .gif, .jpeg, .pdf, .png, .tiff, ainsi que .emf dans le cas d’une utilisation sous Windows).

  • Utilisateurs de RStudio ou d(autres EDI : l’export est généralement possible “à la souris” grâce à un bouton.

  • En mode script : utiliser les fonctions jpeg(), png(), …, avant de créer le graphique, puis terminez par dev.off(). Exemple :

    png("./figures/ma_super_boxplot.png", width = 500)
    boxplot(dat$FM1)
    dev.off()

10.7 (Bonus) Pour aller plus loin

10.7.1 Graphiques interactifs

R propose, à travers le package {plotly}, un système de graphiques interactifs hautement personnalisables, qui s’affichent usuellement dans une fenêtre de navigateur internet. Voir le site web de {plotly} pour découvrir ses immenses possibilités graphiques.

library(plotly)
plot_ly(data = dat, x = ~FM1, y = ~RM1,
        split = ~Site, color = ~Orientation_corps,
        type = "scatter", mode = "markers",
        text = rownames(dat))

10.7.2 Graphiques 3D

Le package {rgl} propose des graphiques 3D dynamiques :

library(rgl)
plot3d(x = dat$FM1, y = dat$RM1, z = dat$RM6,
       type = "s", col = as.numeric(dat$Sexe))

L’argument type = "s" indique que l’on souhaite que les points soient représentés par des sphères, dont on peut changer le rayon avec l’argument radius.

Une alternative est le package {scatterplot3d}, qui propose quant à lui des graphiques 3D statiques avec un effet de profondeur.

library(scatterplot3d)
scatterplot3d(x = dat$FM1, y = dat$TM6, z = dat$RM1,
              box = FALSE, type = "h", pch = 16,
              highlight.3d = TRUE, lty.hplot = 2)
Figure 10.16: Un exemple de graphique 3D statique.