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.
Un exemple de graphique interactif avec R project
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) }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)