Reputation: 606
I would like to plot intersecting surfaces using the R package rgl. I have a 3D array of data and have no problem plotting surfaces at a constant "z" (array[,,n]). However, I can't figure out how to plot a perpendicular surface (array[n,,]) on the same rgl plot.
Example: I can set up the data using:
dat <- list()
lengthout <- 20 # number of data in x, y and z
xrange <- seq(0,10,length.out=lengthout) # sets up dimensions
yrange <- xrange
zrange <- xrange
dat$x <- xrange # contain data in list
dat$y <- yrange
dat$z <- array(rnorm(lengthout^3),dim=c(lengthout,lengthout,lengthout)) # create random data
Then plot multiple flat sections of array[,,n] coloured by value like this:
for (n in seq(1,lengthout,4)){
zlim <- range(dat$z[,,n],na.rm=T) # range of data in slice
zlen <- diff(zlim) + 1 #
colorlut <- rainbow(zlen) # value color lookup table
colmah <- colorlut[dat$z[,,n] -zlim[1]+1] # assign colors to value at each point
surface3d(dat$x,dat$y,array(n,dim=c(lengthout,lengthout)), color=colmah,specular="black",alpha=(1-n/lengthout))
}
Is there a way to rotate the axes of individual surfaces so that I can plot something like this (note constant "x" instead of "z"):
zlim <- range(dat$z[n,,],na.rm=T) # range of data in slice
zlen <- diff(zlim) + 1 #
colorlut <- rainbow(zlen) # value color lookup table
colmah <- colorlut[dat$z[n,,] -zlim[1]+1] # assign colors to value at each point
surface3d(dat$x,dat$y,array(n,dim=c(lengthout,lengthout)), color=colmah,specular="black")
Cheers
Upvotes: 3
Views: 523
Reputation: 606
Solved: Instead of using surface3d(blah), I used rgl.surface( blah, coords=c(3,1,2)):
dat <- list()
lengthout <- 20 # number of data in x, y and z
xrange <- seq(0,10,length.out=lengthout) # sets up dimensions
yrange <- xrange
zrange <- xrange
dat$x <- xrange # contain data in list
dat$y <- yrange
dat$z <- array(rnorm(lengthout^3),dim=c(lengthout,lengthout,lengthout)) # create random data
n=1
# Plot constant "z"
zlim <- range(dat$z[,,n],na.rm=T) # range of data in slice
zlen <- diff(zlim) + 1 #
colorlut <- rainbow(zlen) # value color lookup table
colmah <- colorlut[dat$z[,,n] -zlim[1]+1] # assign colors to value at each point
rgl.surface(xrange,yrange,array(n,dim=c(lengthout,lengthout)), color=colmah,specular="black",alpha=(1-n/lengthout),coords=c(1,2,3))
# Plot constant "x"
zlim <- range(dat$z[n,,],na.rm=T) # range of data in slice
zlen <- diff(zlim) + 1 #
colorlut <- rainbow(zlen) # value color lookup table
colmah <- colorlut[dat$z[n,,] -zlim[1]+1] # assign colors to value at each point
rgl.surface(yrange,zrange,array(n,dim=c(lengthout,lengthout)), color=colmah,specular="black",alpha=(1-n/lengthout),coords=c(3,1,2))
# Plot constant "y"
zlim <- range(dat$z[,n,],na.rm=T) # range of data in slice
zlen <- diff(zlim) + 1 #
colorlut <- rainbow(zlen) # value color lookup table
colmah <- colorlut[dat$z[,n,] -zlim[1]+1] # assign colors to value at each point
rgl.surface(xrange,zrange,array(n,dim=c(lengthout,lengthout)), color=colmah,specular="black",alpha=(1-n/lengthout),coords=c(1,3,2))
axes3d()
Upvotes: 6