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.
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.
install.packages("rgl") # installer la librairie
library(rgl) # lancer la librairie
Cette commande plot3d() permet de tracer un graphique en 3d. Voici comment la paramétrer. cf. exemples ci-après.
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
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")
Il faut faire appel à la commande ellipse3d()
Exemple 05 - Avec ellipsoïde
# 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")
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) }
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')
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')