Graphiques et courbes 3D

en langage R

L'essentiel de cette page !

Il est possible de tracer des graphiques en 3D grâce à la librairie rgl ou encore plot3d.

Une librairie géniale pour réaliser des graphiques 3D très performants et interactifs est plotly.

1. La librairie rgl de R : pour réaliser des graphiques 3D mobiles

Voici quelques graphiques que l'on peut réaliser avec rgl. Ces graphiques sont interactifs : on peut zoomer et tourner le graphique à l'aide de la souris dans tous les sens sous R.

Etape 01 - Installer rgl

install.packages("rgl") # installer la librairie 
library(rgl) # lancer la librairie

La commande plot3d() de rgl

Cette commande plot3d() permet de tracer un graphique en 3d. Voici comment la paramétrer. cf. exemples ci-après.

    • type : type de points
      • "p", points non en 3D
      • "s", sphères 3D
      • "l", points reliés
      • "h", mode histogramme
    • radius : définit la taille des sphères
    • col : couleur des sphères
    • titres des axes : xlab, ylab et zlab
    • xlim,ylim,zlim : limitations des axes
    • box = FALSE ou box = TRUE, permet de tracer le cadre ou non

plot3d obtenu avec la librairie rgl sous R CRAN (gif animé)

Exemple 01 - Graphique

library(rgl)
# Attention, il faut charger la librairie rgl 
# Exemple 1 simple 
x = c(1,2,4,5) ; y =c(2,6,7,8) ; z = c(4,2,4,1) 
plot3d(x,y,z,type="s",radius=0.8,col="red") 

Exemple 02- Graphique avec titres aux axes

x = rnorm(100) ; 
y = rnorm(100)  ; 
z =  rnorm(100)   
plot3d(x,y,z,type="p",col="purple",xlab="parameter x",ylab=" parameter y",zlab="parameter z" ) 
# Pour sauvegarder une capture
rgl.snapshot("rgl_2_R.gif")

Exemple 03 - Nuage de points libre, sans axes, couleur d'arrière plan orange

library(rgl)
# Autre méthode avec la commande rgl.points 
rgl.open()# Ouverture d'une fenêtre 
rgl.bg(color = "orange") # Définir la couleur d'arrière plan 
rgl.points(x, y, z, color = "blue", size = 5) # Tracer

Les commandes sphere3d() et points pour ajouter des sphères en 3D ou des points à un graphique préexistant

Exemple 04 - Nuage de points libre, sans axes, couleur d'arrière plan orange

rgl.bg(color = "white")
  # Etape 1 - tracer le graphique 
x = c(1,2,4,5) ; y =c(2,6,7,8) ; z = c(4,2,4,1)  
plot3d(x,y,z,type="s",radius=0.2,col="red") 

# Etape 2 - ajouter une sphère bleue en coordonnées 3,3,3 
spheres3d(3,3,3,col="blue",radius = 0.3) 

# Etape 3 - ajouter des points verts 
px = rnorm(10) ; py = rnorm(10)  ; pz =  rnorm(10)   
points3d(px,py,pz,col="green") 
rgl.snapshot("rgl_3_R.gif")

Tracer un ellipsoïde pour entourer un nuage de points en trois dimensions

Il faut faire appel à la commande ellipse3d()

Exemple 05 - Avec ellipsoïde

  • level : taille de l'ellipse
  • alpha : degré de transparence
  • type = "shade", "wire" ou "dots" - surface lissée, tirets ou points en surface
# Etape 1 - les points 
x = c(1,2,4,5) ; y =c(2,6,7,8) ; z = c(4,2,4,1)  
plot3d(x,y,z,type="s",radius=0.2,col="red") 

# Etape 2 - configuer l'ellipse 
ellipse <- ellipse3d(cov(cbind(x,y,z)), centre=c(mean(x), mean(y), mean(z)), level = 0.5) 

# Tracer le tout 
plot3d(ellipse, col = "blue", alpha = 0.4, add = TRUE, type="shade") 

Fabriquer un raster d'images gif() dans le but de fabriquer un gif animé

La commande rgl.snapshot() permet de faire une capture gif d'un graphique 3D rgl.

On peut en générer une série de gif qui pourra être animé avec un petit logiciel tel photoscape.

# Etape 1 - définir l'adresse de sauvegarde avec la commande setwd 
setwd("C:\MesDoc")

# Etape 2 - tracer le graphique 
x = c(1,2,4,5) ; y =c(2,6,7,8) ; z = c(4,2,4,1)  
plot3d(x,y,z,type="s",radius=0.2,col="red") 

# Etape 3 - Sauvegarder n gifs en faisant varier l'angle progressivement... 
for (i in 1:45) { 
     rgl.viewpoint(i, 20) 
     filename <- paste("pic", formatC(i, digits = 1, flag = "0"), ".png", sep = "") 
     rgl.snapshot(filename) }  

2. La librairie plot3D de R : pour réaliser des graphiques 3D statiques

Exemple

X1 <- rnorm(45,5,1.5) ; X2 <- rnorm(45,5,1.5) ; X3 <- (X1-5)^2 + 2*(X2-5)^2 
x <- cbind(X1,X2,X3) # matrix(x,ncol=3,byrow=T) #+3
arrowslwd <- 2; pointscex <- 1.5;
library(plot3D)
scatter3D(x[,1], x[,2], x[,3], pch = 19, cex = pointscex, #bty='b2',
    xlab='',ylab='',zlab='',
    main = "", 
    col='red')

3. Régression 3D, nappes et graphiques 3D interactifs : faire appel à plotly !!!

La librairie plotly de R offre une solution très performante pour réaliser de nombreux graphiques 3D de son choix.

Ces graphiques sont tous interactifs et au format html.

plotly est aussi très performant pour rendre interactif des graphiques ggplot. cf. la page - interfaces graphiques.

Etape 1 - Les données - données simulées ici

x1 <- rnorm(20,5,1.5)
x2 <- rnorm(20,5,1.5)
y <- (x1-5)^2 + 2*(x2-5)^2 #+ rnorm(k)
# Etendue de x1, x2 et 
x1lim <- range(x1);x2lim <- range(x2);ylim <- range(y)

Etape 2 - La régression linéraire 3D

# Régression linéaire sur les résultats en fonction des différentes x1 et x2
lm(formula = y ~ I(x1^2) + I(x2^2) +I(x1*x2) + x1 + x2 ) -> lmpoly 
cat( "Equation de la nappe : \n" )
print(lmpoly)

Etape 3 - Fabrication de la grille de la nappe

dim = 45
x1.grid <- seq(x1lim[1],x1lim[2],length.out=dim)
x2.grid <- seq(x2lim[1],x2lim[2],length.out=dim)
x1_x2.grid <-expand.grid(x1=x1.grid,x2=x2.grid)
# Calcul des ordonnées des points de la nappe
y.nappe<-with(x1_x2.grid,
     lmpoly$coefficients[2]*x1^2+     lmpoly$coefficients[3]*x2^2+
     lmpoly$coefficients[4]*x1*x2+     lmpoly$coefficients[5]*x1+
     lmpoly$coefficients[6]*x2+     lmpoly$coefficients[1])
y.mat<- matrix(y.nappe,nrow=dim, ncol=dim,byrow=T)

Etape 4 - Préparer le gradient de couleur


# Programmer les couleurs
col<-c("blue","cyan","yellow","green","brown")
colfunc<-colorRampPalette(col);colors <- (colfunc(20))
# Attribuer une couleur par point de y
colorscale <- cbind(seq(0 , 1, by=1/(length(y) - 1)),colors)

Etape 5 - Configurer le futur graphique

 # Mise en forme
main = "titre"
font <- list(family = "Courier New, monospace",size = 12,color = "#7f7f7f")
xlabel <- list(title = paste("x1"," (x)"),titlefont = font)
ylabel <- list(title = paste("x2"," (y)"),titlefont = font)
zlabel <- list(title = paste("y"," (z)"),titlefont = font)
scene = list(xaxis = xlabel ,yaxis = ylabel ,zaxis = zlabel) 

Etape 6 - Tracer les points et la nappe de régression

require("plotly")
plot_ly(x = x1.grid, y = x2.grid, z = y.mat, colorscale = colorscale) %>%  
  layout(title = main, scene = scene)  %>% add_surface() %>% 
  add_trace(x = x1, y = x2, z = y, mode = 'markers')