J ai fait un petit script pour visualiser des trajectoires (des lignes) en 3D.
Code : Tout sélectionner
### Directement executable
plot3Dlines <- function(x,angle=20,delais=100000,color,...){
time <- 1:dim(x)[[2]]
var1 <- seq(min(x[,,1],na.rm=TRUE),max(x[,,1],na.rm=TRUE),length.out=11)
var2 <- matrix(NA,length(time),length(var1))#outer(x, y, NA)
var2[1,1] <- min(x[,,2],na.rm=TRUE)
var2[length(time),length(var1)] <- max(x[,,2],na.rm=TRUE)
nbLines<-min(100,dim(x)[1])
if(missing(color)){color<-2:(nbLines+1)}else{}
repeat{
res <- persp(x=time, y=var1, z=var2, theta = angle, phi = 10, expand = 0.5, col = "lightblue",
ltheta = 120, shade = 0.75, ticktype = "detailed",xlab = "time", ylab = "var1", zlab = "var2")
angle <- angle+1
for(i in 1:nbLines){
yy=x[i,,1]
zz=x[i,,2]
lines (trans3d(time, yy, zz, pmat = res),col=color[i])
}
for(k in 1:delais){}
}
}
### Tiny exemple
data <- array(c(13,14,13,15, 14,15,16,15, 16,17,16,18 , 45,46,85,59, 43,58,70,56, 45,75,65,65),
dim=c(4,3,2),dimnames=c("id","temps","var"))
plot3Dlines(data)
### Exemple reel
maxId <- 120
maxTime <- 15
f <- function(id,t)((id-1)%%3-1)*t*1.5
g <- function(id,t)((id-1)%%2+1)*t^2/10
data2 <- array(cbind(outer(1:maxId,1:maxTime,f),outer(1:maxId,1:maxTime,g))+
rnorm(maxId*maxTime*2,0,2),dim=c(maxId,maxTime,2) )
plot3Dlines(data2,col=rep(2:7,floor(maxId/6)))
Je ne sais pas vous, moi je trouve ca plutot beau ;-)
Mais reste deux problèmes :
1) Pendant la rotation, la boite change de taille
2) Les lignes sont tracées les une apres les autres. La dernière ligne tracée sera donc au premier plan, même si elle est sensé être cachée. Cela est du au fait que je trace les ligne grâce a lines(trans3d(....)). Il serait bien mieux de faire quelque chose de global genre matplot(trans3d(....)) mais je n ai pas réussi...
Quelqu'un a-t-il une idée pour améliorer ?
Christophe