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)