Combinaisons graphiques avec R

Superposer plusieurs graphiques ou en juxtaposer plusieurs sur une seule fenêtre

L'essentiel de cette page

Une des plus grande difficultés lorsqu'on réalise des graphiques est de superposer des courbes nécessitant des axes gradués différemment ou encore de combiner différents types de graphiques comme une courbe et un diagramme en barre.

Voici quelques règles simples pour y arriver avec R les fonctions split.screen(), layout() et par().

1. Mettre des graphiques côte à côte

On peut facilement découper la fenêtre graphique avec la fonction split.screen().

screen() permettra d'appeler chaque fenêtre par son nom (pour qu'on puisse tracer dans l'ordre souhaité)

Exemple 1 avec 2 fenêtres

x <- rnorm(150) # 150 valeurs simulée
split.screen(1:2)
screen(2) ; plot(x, col="cyan", type="l", lwd=3)
screen(1) ; hist(x, col="orange")

Exemple 2 avec 3 fenêtres

close.screen(all = TRUE)   # Pour réinitialiser la découpe de la fenêtre
# Couper la fenêtre en 2  
split.screen(1:2)    
# Couper en 2 la fenêtre 2.
split.screen(c(1:2), screen = 2)
screen(1) ; plot(1:10,pch=16,col="red")
screen(3) ; plot(1:10,pch=16,col="blue")
screen(4) ; barplot(1,col="green") 

2. Diviser la fenêtre en graphiques avec layout()

Mettre plusieurs graphiques sur une même figure.

La commande layout() : une façon simple de découper la fenêtre graphique en n graphiques de même dimension.

  • Faire une fenêtre avec plusieurs graphiques
  • Partitionner la fenêtre pour tracer plusieurs fenêtres. layout(matrix(1:nb,y,x))
      • nb : nombre total de graphiques
      • y : nombre de lignes
      • x : nombre de colonnes


# layout(matrix(1:nb,y,x))
# exemple
layout(matrix(1:2,1,2))
boxplot(c(1:10),col="#FAD4B1") ; hist(c(3:14,4,5,6,5,6,6),main="",col="#EF8F36")

3. Diviser la fenêtre graphique subtilement avec par()

La commande par() : pour combiner avec précision des graphiques de dimensions variables sur la même fenêtre.

  • Combiner des graphiques à différents endroits avec des surfaces différentes avec la commande par()
    • fig = c(x1,x2, y1,y2) permet de définir la région où sera le graphique : chaque paramètre vaut entre 0 et 1
    • new = T : indique qu'on pourra tracer ensuite un nouveau graphique là où désirerr
    • mar = c(bas,gauche, haut, droite)) : définit les marges autour du graphique. Par défau ces valeurs sont de 5.1, 4.1, 4.1 et 2.1
    • il est possible aussi par la même commande de superposer les graphiques
par(fig=c(x1,x2, y1,y2),new=T,mar = c(bas,gauche, haut, droite))
#exemple
dev.off() # ferme les anciennes fenêtes
# Graphique 1 (en bas à droite sur la partie x de 20% à 100% et la partie y de 0% à 80% ==> c(0.2,1,0,0.8) -  + Une marge importante en bas et à droite ==> mar = c(2,0,0.1,2)
par(fig=c(0.2,1,0,0.8), mar = c(2,0,0.1,2), new=TRUE)
plot(c(1:10),col="green",pch=16)
# Graphique 2
par(fig=c(0.2,1,0.8,1), mar = c(0,0,2,2), new=TRUE)
barplot(c(1:10),col="blue")
# Graphique 3
par(fig=c(0,0.2,0,0.8), mar = c(2,0,0.1,2), new=TRUE)
boxplot(rnorm(10000,20,3),col="red")

4. Superposer plusieurs graphiques sur un même graphique

Mots clefs : graphiques superposés - superposition de graphiques - modifier le graphique d'arrière-plan.

Superposer des graphiques présente quelques difficultés dans la mesure où il va falloir attribuer les axes à différentes courbes avec éventuellement des graduations différentes.

La démarche est pourtant simple. Il faut :

  1. Tracer le premier graphique sans afficher aucun axe)
  2. Indiquer son axe y (celui de gauche ou celui de droite)
  3. Indiquer qu'on va tracer un deuxième graphique (commande par(new=T) )
  4. Tracer le 2ème graphique
  5. Indiquer l'axe y de ce 2ème graphique (celui qui reste)
  6. Graduer l'axe des x
  • Étape 1 - créer le fenêtre graphique
    • plot.new() : nouveau graphique
    • mar définit les marges pour permettre l'ajout d'un axe à droite ( c( bas,gauche, haut, droite ) )
    • plot : trace ici la courbe, ce peut eêtre aussi une autre commande type barplot mais attention : il ne faut ni afficher les axes (axes = F) ni les titres des axes (xlab = "" et ylab ="")
plot.new() 
par(mar=c(4,4,3,5)) 
plot(c(1:10),col="blue",axes=F,xlab="",ylab="") 
  • Étape 2 - graduer et titrer l'axe correspondant
    • axis va permettre de tracer le graphique y correspondant à la courbe (2 si à gauche, 4 si à droite). On doit aussi indiquer une couleur et aussi la manière d'être gradué. (at(0,10,by=2) indique une graduation de 0 à 10 de 2 en 2.
    • mtext permet d'indiquer le titre de l'axe (line précise la distance par rapport à l'axe pour laisser de la place aux graduations et side si c'est l'axe de gauche ou de droite)
axis(2, ylim=c(0,10),col="blue",col.axis="blue",at=seq(0, 10, by=2)) 
mtext("Axe de la courbe bleue",side=2,line=2.5,col="blue")  
  • Étape 3 - indiquer qu'on va tracer le 2 ème graphique
    • Comme précédemment, on indique qu'il ne faut ni titre des axes, ni tracé des axes
par(new = T)  
  • Étape 4 - graduer et titrer le 2 ème graphique
    • Comme précédemment, on utilise axis et mtext cette fois-ci pour tracer un autre axe y des ordonnées
plot(c(25:35),col="red",axes=F,xlab="",ylab="",ylim=c(20,40)) 
  • Étape 5 - graduer et titre le 2 ème graphique
    • Comme précédemment, on utilise axis et mtext cette fois-ci pour tracer un autre axe y des ordonnées
axis( 4 ,col="red",col.axis="red",at=seq(20, 40, by=5)) 
mtext("Axe de la courbe rouge",side=4,line=2.5,col="red") 
# le 4 indique l'axe de droite  
  • Étape 6 - graduer l'axe des x
axis( 1 , ylim=c(20,40),col="black",col.axis="black",at=seq(0, 12, by=2)) 
mtext("Axe des X",side=1,line=2.5,col="black") 
# le  1  indique l'axe d'en bas, un 3 aurait été pour en haut 
Combinaison graphique (2 axes des ordonnées)

Exemple simple de superposition de 2 courbes (script présenté ci-dessus, en téléchargement direct)