Interface graphique et graphique interactif avec R project CRAN
La fonction ci-dessous permet de cliquer sur un point pour voir sa description s'afficher sur le graphique.
C'est une fonction qui regroupe 2 fonctions qui sont reconnus par la commande getGraphicsEvent.
- La commande mousedown : détecte les clicks et change l'affichage du point le plus proche en conséquence. Si le titre du point est déjà indiqué, il sera masqué.
- La commande move détecte les déplacements de la souris pour que 2 traits suivent le curseur - ce pourrait être une toute autre action.
- D'autres commandes pourraient être ajoutées onMouseUp, onKeybd. cf. ce lien.
Un exemple de graphique interactif avec R project
- La fonction, cette fonction étant modifiable à volonté : à copier-coller dans la console
plot_id_point <- function(valeurs_x,valeurs_y,xlab="",ylab="",main="",
labels=c(1:length(valeurs_x)),console=c(1:length(valeurs_x)),
col="black",pch=1,lty=1,lwd=1,cex=1,
col_point="red",pch_point=1,cex_point=2) {
decallage = (max(valeurs_y)-min(valeurs_y))/50
assign(x="id_point",value=0,envir=.GlobalEnv) ; assign(x="id_points",value=c(),envir=.GlobalEnv)
plot(valeurs_x,valeurs_y,xlab=xlab,ylab=ylab,main=main,col=col,pch=pch,lty=lty,lwd=lwd)
# Lorsqu'opn clique avec la souris
mousedown <- function(buttons, x, y) {
plx <- grconvertX(x,"ndc","user")
ply <- grconvertY(y,"ndc","user")
x_min = valeurs_x-plx ; y_min = valeurs_y-ply
distance = sqrt(x_min^2+y_min^2)
point = which(abs(distance) ==(sort(abs(distance))[1]))
cat("Point de coordonnées :\nx : ",valeurs_x[point],"\ny : ",valeurs_y[point],".\n")
cat("Valeur correspondante : ",console[point],"\n")
plot.new()
plot(valeurs_x,valeurs_y,xlab=xlab,ylab=ylab,main=main,col=col,pch=pch,lty=lty,lwd=lwd)
if (id_point == 1) {
if (id_points[1] == point) {
# Si id_points (point en mémoire, indique que le point cliqué l'a déjà été.
assign(x="id_point",value=0,envir=.GlobalEnv)
points(valeurs_x[point],valeurs_y[point],col=col_point,pch=pch,cex=cex)
text(valeurs_x[point],valeurs_y[point]+decallage,labels[which(valeurs_x==valeurs_x[point])])
}
}
else {
# Si point déjà coloré en rouge, id_point=0
# Si je reclique sur le point, le point ne sera plus en rouge.
id_point=1
assign(x="id_point",value=1,envir=.GlobalEnv)
}
if (id_point == 1) {
# Lorsqu'on clique sur un point alors qu'aucun n'est déjà surligné
points(valeurs_x[point],valeurs_y[point],col=col_point,pch=pch,cex=cex)
text(valeurs_x[point],valeurs_y[point]+decallage,labels[which(valeurs_x==valeurs_x[point])])
}
# Mémoriser le point validé (ide_points)
assign(x="id_points",value=c(point,point),envir=.GlobalEnv)
#bringToTop(-1)
#id.exit.automatique = TEST(1,"Sortir ? (O ou N ?)")
#if (id.exit.automatique==1) {return(ptt.temp)}
#else {
#bringToTop()
plot.new()
#}
}
# Lorsqu'on déplace la souris
mousemove <- function(buttons, x, y) {
plx <- grconvertX(x,"ndc","user")
ply <- grconvertY(y,"ndc","user")
plot.new()
plot(valeurs_x,valeurs_y,xlab=xlab,ylab=ylab,main=main,col=col,pch=pch,lty=lty,lwd=lwd)
x_min = valeurs_x-plx ; y_min = valeurs_y-ply
distance = sqrt(x_min^2+y_min^2)
point = which(abs(distance) ==(sort(abs(distance))[1]))
if (id_point == 1) {
# Lorsqu'un point est déjà cliqué, on l'affiche en permanence
points(valeurs_x[id_points[1]],valeurs_y[id_points[2]],col="red",pch=pch,cex=cex)
text(valeurs_x[id_points[1]],valeurs_y[id_points[2]]+decallage,labels[which(valeurs_x==valeurs_x[id_points[1]])])
}
abline(h=ply,col="black",lty=3)
abline(v=plx,col="black",lty=3)
#Lorsque la souris passe à proximité d'un point, il s'entoure en rouge
points(min(valeurs_x[point]),min(valeurs_y[point]),col=col_point,pch=pch_point,cex=cex_point)
NULL
}
ptt = getGraphicsEvent("",onMouseDown=mousedown, onMouseMove = mousemove) }
- Si on veut maintenant afficher le graphique. (exemple)
x <- rnorm(100,20,3)
y <- rnorm(100,22,3.5)
noms = c("George","Tonio","Julien","Anne","Catherine","Céline","Christian","Nora","Florent","Aurélien")
noms <- rep(noms,10)
pour_console = sqrt(x^2+y^2)
plot_id_point(x,y,pch=16, col="#12AA56",col_point="red",labels=noms,console=pour_console)