Ajouter des annotations sur un graphique R 

(légende, flèches, annotations, ellipses, polygones...)

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

x=donne la position de la légende :ou on donne des coordonnées (ex : c(1,2)) ou on écrit "bottomright", "bottomleft", topright" ou encore "topleft".legend : l'intitulé de chaque légendecol : la couleur de chaque légendepch : le type de pointslwd et lty : le type de traitscex : valeur unique, taille du cadre de légendept.cex : taille de chaque pointtext.width : valeur de la taille de l'ensemble du textebty="n" : pour ne pas tracer de boîte autour de la légendeMots clefs : légende, legend

# 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))


Aide à l'utilisation de R - legend - légende d'un graphique
Ce graphique donne un exemple de légende où les types de points sont indiqués. De la même façon, on peut indiquer le type de traits en usant des paramètres comme lty et lwd.

# 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()

Colorer les points automatiquement en fonction d'un critère - légende avec gradient de couleur R project CRAN

Ajouter des annotations (texte, flèche, équation d'une droite)

# 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) 

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




# 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) 

# 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") 

Graphique à polygones réalisés avec le logiciel R

 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)

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...


# 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)

# 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

Nécessite la librairie cluster

# 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")


Ellipse de regroupement de points (R project CRAN)
Confidence ellipseconf.level : 0.95 ou 0.5Nécessite la librairie ellipsePour aller plus loin : lien extérieur. Ce lien permet aussi de faire de telles ellipses sous ggplot2.

# 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"))


Regroupement de points par ellipse de confiance (R project CRAN)
Nécessite la librairie ggplot2Pour aller plus dans la compréhension de ggplot2 et ses fonctionnalités très étendues : lien externe.

# 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()


Regroupement par ellipse grâce à la fonction ggplot R project CRAN
Nécessite la librairie mixtoolsCalculs reposant sur la covariance

# 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) 

}

Ellipses pour différentes catégories tracées avec mixtools (R project CRAN)
Entourer un nuage de points (scatter plot boudaries) d'un polygone qui inclue tous les points dans une forme non ellipsoïdale.

# 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")