8 Les graphiques de base en R

R peut être utilisé pour réaliser toute sorte de graphiques de plus simples au plus complexes. Il existe plusieurs packages pour réaliser des graphiques dans R, parmi lesquels il y a

  • graphics qui vient charger d’office avec R. Ce package représente le système graphique de base en R. Il est le sujet principal de ce chapitre.

  • lattice qui, principalement, ajoute quelques fonctionnalités à graphics. Ce package ne sera pas traité ici.

  • ggplot2 qui propose une approche plus moderne et qui permet de créer des graphiques de qualité professionnelle. Ce package sera traité dans le chapitre suivant.

8.1 La fonction plot()

La fonction la plus couramment utilisée pour produire des graphiques dans R est la fonction plot(). plot() est une fonction générique dont le comportement s’adapte automatiquement à la nature de ses arguments. Il y a deux syntaxes possibles pour cette fonction :

  • syntaxe classique: plot(x = varX, y = varY)
  • syntaxe à base de formule: plot(varY ~ varX),

varX et varY sont les noms des variables à mettre dans l’axe des x et l’axe des y, respectivement. L’expression varY ~ varX est un exemple de ce que R appelle formula (formule). Dans cette expression varY désigne la variable dépendante (à expliquer, càd., celui dont on cherche à étudier les variations) et varX la variable indépendante (explicative). Si vous tapez methods(plot), vous allez voir, dans liste des méthodes, la fonction plot.formula(). C’est cette dernière qui est en réalité appelée à chaque fois qu’une formule est introduite comme argument.

Voici un exemple qui illustre les deux syntaxes.

# les données
x <- seq(-pi, pi, 0.1)
y <- sin(x)
plot(x, y)   # format classique
plot(y ~ x)  # formule ---> plot.formula

Avec la syntaxe “formule”, la fonction plot() accepte l’argument data (voir le Help de plot.formula()) qui permet de simplifier davantage la syntaxe lorsqu’il s’agit de données stockées dans des data frames. Ainsi les deux lignes de codes suivantes sont équivalentes et produisent le même graphique que ci-dessus.

dt <- data.frame(z = x, w = y)
plot(dt$w ~ dt$z)
plot(w ~ z, data = dt)

La fonction plot() accepte une multitude d’arguments qui permettent de façonner les graphiques (voir le Help pour plus de détails).

plot(w ~ z, data = dt,
  type = "o", # type de tracé: points ("p"), lignes ("l"), les deux ("b" ou "o"), ...
  col = "blue", # couleur, tapez `colours()` pour la liste complète
  pch = 4, # type de symboles, un chiffre entre 0 et 25, tapez `?points`
  cex = 0.5, # taille des symboles
  lty = 3, # type de lignes, un chiffre entre 1 et 6
  lwd = 1.2, # taille de lignes
  xlim = c(-2.5, 2.5), # limites de l'axe des x
  ylim = c(-1.5, 1.5), # limites de l'axe des y)
  xlab = "La variable z", # titre pour l'axe des x
  ylab = "Le sinus  de z", # titre pour l'axe des y
  main = "La fonction sinus entre -pi et pi" # titre général pour le graphique
) 

Types de fonctions graphiques

Il y a trois types de fonctions graphiques en R: (i) les fonctions, dites de niveau supérieur, qui servent à créer de nouveaux graphiques; par exemple: plot(), boxplot(), barplot(), hist(), curve(), etc.; (ii) les fonctions, dites de niveau inférieur, qui servent à jouter de l’information à un graphique existant; par exemple: legend(), title(), points(), lines(), text(), etc.; (iii) les fonctions utilisées pour fixer et contrôler des paramètres graphiques généraux tels que la disposition des figures, la taille des marges, la forme des axes, la police à utiliser, etc.; par exemple: par() et layout(). Ce dernier type de fonction ne sera pas traité ici.

Voici une illustration.

plot(w ~ z, data = dt)
points(x = -3:3, y = c(-1, -0.7, 0.3, 0, -0.3, 0.7, 1), col = "blue", pch = 4)
lines(x = -3:3, c(-1, -0.7, 0.3, 0, -0.3, 0.7, 1), col = "red")
text(x = -3:3, y = c(-1, -0.7, 0.3, 0, -0.3, 0.7, 1) + 0.05, labels = c("a", "b", "c", "d", "e", "f", "g"))

Sauvegarder un graphique

Un graphique crée dans RStudio est affiché par défaut dans l’onglet Plots. Vous pouvez utiliser cet onglet pour zoomer sur un graphique en cliquant sur le bouton Zoom. Vous pouvez aussi enregistrer le graphique en cliquant sur le bouton Export.

Pour sauvegarder un graphique R (tel que vous le visualisez sur votre écran) en format PDF, vous pouvez aussi exécuter le code suivant en remplaçant filename par le le nom que vous voulez. Le fichier ainsi créé sera enregistré dans votre répertoire de travail R.

dev.print(pdf, "filename.pdf") # <-- remplacez 'filename' (gardez l'extension pdf)

8.2 Variable numérique

Pour les exemples qui vont suivre, nous allons utiliser le jeu de données mpg disponible dans le package ggplot2. Dans ce qui suit, ce dernier est supposé être installé sur votre machine.

data(mpg, package = "ggplot2")
head(mpg)
  manufacturer model displ year cyl      trans drv cty hwy fl   class
1         audi    a4   1.8 1999   4   auto(l5)   f  18  29  p compact
2         audi    a4   1.8 1999   4 manual(m5)   f  21  29  p compact
3         audi    a4   2.0 2008   4 manual(m6)   f  20  31  p compact
4         audi    a4   2.0 2008   4   auto(av)   f  21  30  p compact
5         audi    a4   2.8 1999   6   auto(l5)   f  16  26  p compact
6         audi    a4   2.8 1999   6 manual(m5)   f  18  26  p compact
str(mpg)
Classes 'tbl_df', 'tbl' and 'data.frame':   234 obs. of  11 variables:
 $ manufacturer: chr  "audi" "audi" "audi" "audi" ...
 $ model       : chr  "a4" "a4" "a4" "a4" ...
 $ displ       : num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
 $ year        : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
 $ cyl         : int  4 4 4 4 6 6 6 4 4 4 ...
 $ trans       : chr  "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
 $ drv         : chr  "f" "f" "f" "f" ...
 $ cty         : int  18 21 20 21 16 18 18 18 16 20 ...
 $ hwy         : int  29 29 31 30 26 26 27 26 25 28 ...
 $ fl          : chr  "p" "p" "p" "p" ...
 $ class       : chr  "compact" "compact" "compact" "compact" ...

Pour plus d’information sur ces données et leur nature, tapez ?mpg. Nous allons par la suite transformer cyl, trans, drv, fl et class en facteur et modifier les niveaux de trans.

mpg <- transform(mpg, cyl = factor(cyl), trans = factor(trans), drv = factor(drv), fl = factor(fl), class = factor(class))
levels(mpg$trans) <- c(rep("auto", 8), rep("manual", 2))
summary(mpg)
 manufacturer          model               displ           year      cyl   
 Length:234         Length:234         Min.   :1.60   Min.   :1999   4:81  
 Class :character   Class :character   1st Qu.:2.40   1st Qu.:1999   5: 4  
 Mode  :character   Mode  :character   Median :3.30   Median :2004   6:79  
                                       Mean   :3.47   Mean   :2004   8:70  
                                       3rd Qu.:4.60   3rd Qu.:2008         
                                       Max.   :7.00   Max.   :2008         
                                                                           
    trans     drv          cty            hwy       fl             class   
 auto  :157   4:103   Min.   : 9.0   Min.   :12.0   c:  1   2seater   : 5  
 manual: 77   f:106   1st Qu.:14.0   1st Qu.:18.0   d:  5   compact   :47  
              r: 25   Median :17.0   Median :24.0   e:  8   midsize   :41  
                      Mean   :16.9   Mean   :23.4   p: 52   minivan   :11  
                      3rd Qu.:19.0   3rd Qu.:27.0   r:168   pickup    :33  
                      Max.   :35.0   Max.   :44.0           subcompact:35  
                                                            suv       :62  

une seule variable numérique

# gauche supérieur
stripchart(mpg$displ, xlab = "displ", pch = 16)
# droite supérieur
stripchart(mpg$displ, xlab = "displ", method = "stack", pch = 16)
# gauche inférieur
stripchart(mpg$displ, xlab = "displ", method = "jitter", pch = 16)
# droite inférieur
stripchart(mpg$displ, ylab = "displ", method = "jitter", vertical = TRUE, pch = "+")

numeric ~ facteur(s)

stripchart(hwy ~ trans, data = mpg, vertical = TRUE, pch = 16, metho = "jitter")

boxplot(hwy ~ trans, data = mpg)

boxplot(hwy ~ trans, data = mpg)
stripchart(hwy ~ trans, data = mpg, vertical = TRUE, pch = 16, metho = "jitter", add = TRUE)

boxplot(hwy ~ trans + drv, data = mpg)

numeric ~ numeric

plot(hwy ~ displ, data = mpg, pch = 16)

numeric ~ numeric + factor

plot(hwy ~ displ, col = trans, data = mpg, pch = 16)
# ajouter une légende
legend(x = "topright", title = "trans", legend = levels(mpg$trans), col = mpg$trans, pch = 16, ncol = 2, bty = "n")

8.3 Facteur

un seul facteur

plot(mpg$drv)   #---> barplot()
title(x = "drv", y = "Freq")

xtabs(~drv, data = mpg) |> proportions() |> barplot(xlab = "drv", ylab = "Prop")

deux facteurs

xtabs(~ drv + trans, data = mpg) |> proportions("trans") |> barplot(xlab = "trans", ylab = "Prop", legend = TRUE, args.legend = list(title = "drv"))

xtabs(~ drv + trans, data = mpg) |> proportions("trans") |> barplot(beside = TRUE, xlab = "trans", ylab = "Prop", legend = TRUE, args.legend = list(title = "drv"))

plot(drv ~ trans, data = mpg) #---> spineplot()

facteur ~ numeric

plot(trans ~ hwy, data = mpg) #---> spineplot()

8.4 Distribution d’une variable numérique

histogramme

hist(mpg$displ)

hist(mpg$displ, freq = FALSE) # histogramme des densités (surface totale égale à 1)

densité échantillonnale

density(mpg$displ) |> plot(main = "Density of mpg$displ")

hist(mpg$displ, freq = FALSE, main = "")
density(mpg$displ) |> lines(col = "blue")
title(main = "Histogramme et densité")

8.5 Tracer une fonction

plot(sin, from = -2 * pi, to = 2 * pi) #---> curve()

curve(x^2, from = 0, to = 20, col = "red", lty = 1, ylab = "y")
curve(x^(2.5), from = 0, to = 20, col = "gray", lty = 2, add = TRUE)
curve(x^(3), from = 0, to = 20, col = "blue", lty = 3, add = TRUE)
legend("topright", title = "Function", legend = c("x^2", "x^2.5", "x^3"), col = c("red", "gray", "blue"), lty = 1:3, bty = "n", inset = c(0.2, 0))