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