Ajouter des annotations sur un graphique R
(légende, flèches, annotations, ellipses, polygones...)
Tracer un graphique de type y = f(x) (fonction plot) et le mettre en forme
Superposer d'autres informations (polygones, légende, ellipses...)
Autres types de graphiques (logarithmiques, 3D, données calendaires...)
L'essentiel de cette page !
Annoter un graphique sous R (ou un diagramme en général) est assez facile. Une légende s'ajoutera avec la commande legend(). On peut ajouter des annotations (commentaires, équation d'une droite) avec la commande text() où la fonction expression() permettra d'intégrer du langage mathématique ou du texte en indice/exposant.
Pour ajouter une flèche : la commande arrow(), un segment : segments(), un polygone : polygon()...
Pour tracer un ellipsoïde ou une forme convexe autour d'un nuage de points afin de les regrouper, voir plus bas dans la page.
Ajouter une légende
Légender : ajouter une légende à un graphique déjà tracé
# Un exemple de graphique
plot(x=rnorm(20,75,3),y=rnorm(20,175,4),xlab="Poids (kg)",
ylab="Taille (cm)",col="cyan",pch=0,xlim=c(50,90),ylim=c(130,190),cex=2)
points(x=rnorm(20,60,3),y=rnorm(20,160,4),col="pink",pch=15,cex=2)
#Ajouter une légende en bas à droite
legend(x="bottomright", legend=c("hommes","femmes"), col=c("cyan","pink"), pch=c(0,15))
Tracer une légende seule sans graphique (exemple)
# Ce code va tracer une image png avec une légende seule à l'adresse disponible avec getwd()
png("legend.png",width=2000,heigh=1000)
taille = 3
plot(-1,1,type="n",axes=F,xlab="",ylab="")
legend(x="topright",legend=c("Ambassade","Légation","Consultat général","Consultat","Vice-consulat"),
,pch=c(0,15,2,17,17),bg="white",pt.cex=c(taille*1.5,taille,taille,taille,taille/3*2),
cex=2,text.width=0.8,border="white",bty = "n")
dev.off()
getwd()
Faire une légende avec un gradient de couleurs
Ajouter des annotations (texte, flèche, équation d'une droite)
Ajouter une annotation au point de coordonnées (x, y)
font : permet de modifier le style d'écriture
(font = 3 <=> italique)
cex : taille d'écriture
adj = c(0.5,0) permet de centrer le texte - la première valeur est le centrage horizontal (ici : 0.5 veut dire centré) - la deuxième valeur et le centrage vertical (ici : 0 veut dire aligné en haut)
# Ecrire inclinaison au point de coordonnées x=4 et y=80
x = c(1:4) ; y = c(78:81)
plot(x,y,type="o",col="orange",pch=18)
text(3, 79, "Inclinaison",cex=1.2,font=3)
Afficher sur un graphique la description de variables avec la commande text()
x = c(1:4) ; y = c(2:5)
plot(x,y,type="o",col="green",pch=17)
text(2,3.5,paste("Valeur moyenne de x :",round(mean(x),0)))
# text ajoute une annotation en position 2,3 (dans l'exemple)
# paste permet de combiner texte et valeurs calculées
Afficher l'équation d'une droite avec les fonction text() et expression()
Ajouter une flèche
arrows(x0,y0,x1,y1) : permet de tracer une flèche permettant d'aller du point 0 de coordonnées (x0,y0) vers le point 1 de coordonnées (x1,y1)
Il est aussi possible de faire dépasser une flèche de la fenêtre graphique (voir exemple ci-dessous ou cliquer ici)
# Ajoute une flèche qui part du point de coordonnées x=4 et y=40 pour arriver au point x=6 et y=60
arrows(4,40, 6, 60)
# La même flèche de couleur rouge
arrows(4,40, 6, 60, col = "red")
# La même flèche orientée dans l'autre sens
arrows(4,40, 6, 60, code = 1)
# La même flèche pointant dans les 2 directions
arrows(4,40, 6, 60, code = 3)
# La même flèche mais plus épaisse
arrows(4,40, 6, 60, lwd = 2)
# La même flèche mais avec des bordures de pointe plus longue
arrows(4,40, 6, 60, length = 0.9)
# La même flèche mais avec un angle de pointe plus serré
arrows(4,40, 6, 60, angle = 20)
Ajouter une flèche et une annotation en cliquant directement sur le graphique
# Il suffit de coller et exécuter ce script
cat("Cliquer sur le début de la flèche")
debut = locator(n=1)
cat("Cliquer sur la fin de la flèche")
fin = locator(n=1)
arrows(debut$x,debut$y, fin$x,fin$y, angle = 20, lwd=2, length=0.1)
cat("Cliquer sur la zone du texte à afficher")
l = locator(n=1)
text(l$x,l$y, "Text à afficer à remplacer par le sien")
Graphiques à polygones (régions bleues) - disponible au format script (avec l'autorisation de O. Couffin)
Intégrer du texte en indice ou en exposant dans un graphique (titres des axes ou autre)
Ajouter des formules, des expressions, du texte en indice ou en exposant
Pour aller plus loin : chercher sur internet : expression, annotate, plotmat, bquote, library ggplot
x = c(1:4) ; y = c(2:5)
axe_x = expression(A[505]) # les crochets []mettent 505 en indice
axe_y = expression(Concentration~~en~~mol.L^-1)
# ~~ pour les espaces ici mol.L-1 voit -1 mis en exposant grâce au ^
plot(x,y,xlab=axe_x,ylab=axe_y,type="o",col="red",pch=16
Superposer des segments, des polygones...
Ajouter un segment
# La fonction arrows permet de faire un segment
# arrows(x1,y1,x2,y2, code= 0)
arrows(4,40, 6, 60, code = 0)
# Autre manière plus simple
segments(4,40, 6, 60, code = 0)
Ajouter un polygone
# Exemple : traçons un graphique
plot(x=c(1:10),y=c(1:10))
# Tracer un polygone (x et y sont les coordonnées des points)
polygon(x=c(1,2,2,1),y=c(3,3,5,5),col="red",border=NA)
# Tracer un polygone (x et y sont les coordonnées des points)
polygon(x=c(4,6,6,5,4),y=c(3,3,5,7,5),col="#DD2233CC",border=NA)
Regrouper des points dans des ellipses ou une forme polygonale
MÉTHODE 1 - Simple - Ajouter une ellipse qui couvre exactement un ensemble de points
# Simulation de valeurs x et y pour l'exemple
x <- rnorm(100,20,3) ; y <- rnorm(100,10,6)
# Points à regrouper dans l'ellipse
x_ell <- x[x>20&x<25&y<14&y>6] ; y_ell <- y[x>20&x<25&y<14&y>6]
xy_ell <- data.frame(x_ell,y_ell)
# Tracer le graphique avec les points à entourer en bleu
plot(x,y) ; points(xy_ell,col="blue",pch=16)
# Tracer l'ellipse
require(cluster)
ellipse <- ellipsoidhull(as.matrix(xy_ell)) # ?ellipsoidhull
# Tracer un polygone translucide sans bordure
polygon(predict(ellipse),col="#9999DD55",border=NA)
# Tracer une ligne de bordure de l'ellipse sans remplissage
lines(predict(ellipse),col="red")
METHODE 2 - Ajouter une ellipse de confiance à 95% sur des coordonnées xy
# Simulation de valeurs x et y pour l'exemple
x <- rnorm(100,20,3) ; y <- rnorm(100,10,6)
# Points à regrouper dans l'ellipse
x_ell <- x[x>20&x<25&y<14&y>6] ; y_ell <- y[x>20&x<25&y<14&y>6]
xy_ell <- data.frame(x_ell,y_ell)
# Tracer le graphique avec les points à entourer en bleu
plot(x,y) ; points(xy_ell,col="blue",pch=16)
# Le tracer de l'ellipse se fait avec la librairie ellipse dont la fonction ellipse est en concurrence avec d'autres librairies (car, mixtools) - On détecte ce problème par l'erreur : "(...) center must be a vector of length (...)
# Fonction pour éviter le problème :
detach("package:car");detach("package:mixtools")
# Tracer une ellipse (intervalle de confiance à 50%)
install.packages("ellipse") ; library("ellipse")
lines(ellipse(cov(xy_ell),centre=colMeans(xy_ell),level=0.50),type="l", lty=2, col="blue")
# Ajouter une ellipse (intervalle de confiance à 95%)
lines(ellipse(cov(xy_ell),centre=colMeans(xy_ell),level=0.95),type="l", lty=1, col="cyan")
# Ajouter la légende pour interprétation
legend("topleft",legend=c("50%","95%"),lty=c(2,1),col=c("blue","cyan"))
METHODE 3 - SOUS GGPLOT - Ajouter des ellipses automatiquement en regroupent par catégories (complément utile à une ACP)
# Simuler des données x et y et 2 catégories (pour l'exemple)
x <- rnorm(100,20,3) ; y <- rnorm(100,10,6)
categories <- rep("Males",100) ; categories[x>20&y<10] <- "Femelles"
data <- data.frame(abscisses = x, ordonnées=y, groupe = categories);head(data)
# Tracer les données simplement sans ellipse
install.packages("ggplot2");library(ggplot2)
ggplot(data, aes(x=abscisses , y=ordonnées)) + geom_point()
# Regrouper tous les points dans une ellipse
ggplot(data, aes(x=abscisses , y=ordonnées)) + geom_point()+stat_ellipse()
# Regrouper les points par catégorie (Femelles et Males)
graphique <- ggplot(data, aes(x=abscisses , y=ordonnées,color=groupe)) + geom_point()
# Tracer
graphique + stat_ellipse()
# Autre exemple : regrouper selon un critère vrai ou faux
graphique <- ggplot(data, aes(x=abscisses , y=ordonnées,color=ordonnées>8)) + geom_point()
graphique + stat_ellipse()
MÉTHODE 4 - Autre ellipse selon la covariance avec la librairie mixtools
# Exemple de valeurs simulées (4 catégories) à copier tel quel
x <- rnorm(200,1,2);y <- rnorm(200,1,2);plot(x,y)
#Fonction de définition d'un cercle pour simuler une categorie pour une zone circulaire
circu = function(xx, yy, r){ind = sqrt( (x-xx)^2 + (y-yy)^2 )<r ; return (ind)}
categories =rep("neutre", 200) ; ind = circu(2.5,2.5,2.5) ;
categories[ind] <- "acide"; ind = circu(-2,-2,1.5) ;
categories[ind] <- "basique";ind = circu(0.5,-0.25,1) ;
categories[ind] <- "atypique";color = categories;j = 0
# Faire correspondre une couleur à chaque catégorie
for (i in unique(categories)) {j = j+1;color[categories == i] <- j}
# Afficher le graphique
plot(x,y,col=color)
# Tracer les ellipses avec mixtools
install.packages("mixtools")
detach("package:ellipse") # inactiver la librairie ellipse (si utilisée)
library(mixtools)
# Une couleur par ellipse
j=0
for (i in unique(categories)) {
j = j+1
catego <- data.frame(x=x[categories == i],y=y[categories == i])
ellipse(mu=colMeans(catego), sigma=cov(catego), alpha = .05, npoints = 250, col=j)
}
Entourer un nuage de points d'une nappe convexe
# Reprise et amélioration de la fonction disponible sur
# https://chitchatr.wordpress.com/2011/12/30/convex-hull-around-scatter-plot-in-r/
# Version 3
convexhull<-function(x, y, col="#00000000",border="black",lwd=lwd){
hpts <- chull(x = x, y = y)
hpts <- c(hpts, hpts[1])
polygon(x[hpts], y[hpts],col=col,border=border,lwd=lwd)
}
x <- rnorm(200,3,3)
y <- rnorm(200,3,3)
x1 <- rnorm(200,10,2)
y1 <- rnorm(200,0,2)
plot(x,y,xlim=c(-10,15),ylim=c(-10,15),col="#FFAAAA",lwd=2,pch=16,cex=1.5)
points(x1,y1,col="blue",pch=16)
convexhull(x = x, y = y,border="red",lwd=2,col="#FF000066")
Tracer un graphique de type y = f(x) (fonction plot) et le mettre en forme
Superposer d'autres informations (polygones, légende, ellipses...)
Autres types de graphiques (logarithmiques, 3D, données calendaires...)