R: ttwig 4D, x, y, z, colores

¿Podría darme un ejemplo sobre cómo usar rgl para trazar 3 variables en los ejes x, y y z y una cuarta con diferentes colores?

Gracias

Utiliza una combinación de persp y color según una función separada. Aquí hay un código de ejemplo:

 ## Create a simple surface f(x,y) = -x^2 - y^2 ## Colour the surface according to x^2 only nx = 31; ny = 31 x = seq(-1, 1, length = nx) y = seq(-1, 1, length = ny) z = outer(x, y, function(x,y) -x^2 -y^2) ## Fourth dim z_col = outer(x, y, function(x,y) x^2) ## Average the values at the corner of each facet ## and scale to a value in [0, 1]. We will use this ## to select a gray for colouring the facet. hgt = 0.25 * (z_col[-nx,-ny] + z_col[-1,-ny] + z_col[-nx,-1] + z_col[-1,-1]) hgt = (hgt - min(hgt))/ (max(hgt) - min(hgt)) ## Plot the surface with the specified facet colours. persp(x, y, z, col = gray(1 - hgt)) persp(x, y, z, col=cm.colors(32)[floor(31*hgt+1)], theta=-35, phi=10) 

Esto da:

Muestra de salida

RGL

Es bastante sencillo utilizar la técnica anterior con la biblioteca rgl:

 library(rgl) ## Generate the data using the above commands ## New window open3d() ## clear scene: clear3d("all") ## setup env: bg3d(color="#887777") light3d() surface3d(x, y, z, color=cm.colors(32)[floor(31*hgt+1)], alpha=0.5) 

Hay un ejemplo en? Plot3d si estás hablando de trazar puntos en un espacio 3d y colorearlos:

 x <- sort(rnorm(1000)) y <- rnorm(1000) z <- rnorm(1000) + atan2(x,y) plot3d(x, y, z, col=rainbow(1000)) 

Pero si quiere colorear los puntos con una cuarta variable, digamos una variable de agrupamiento, entonces podemos modificar el ejemplo anterior para hacer esto creando una variable de agrupación

 grp <- gl(5, 200) ## 5 groups 200 members each ## now select the colours we want cols <- 1:5 ## Now plot plot3d(x, y, z, col=cols[grp]) 

OK, ¿es esto más lo que quieres?

 X <- 1:10 Y <- 1:10 ## Z is now a 100 row object of X,Y combinations Z <- expand.grid(X = X, Y = Y) ## Add in Z1, which is the 3rd variable ## X,Y,Z1 define the surface, which we colour according to ## 4th variable Z2 Z <- within(Z, { Z1 <- 1.2 + (1.4 * X) + (-1.9 * Y) Z2 <- 1.2 + (1.4 * X) - (1.2 * X^2) + (1.9 * Y) + (-1.3 * Y^2) Z3 <- 1.2 + (1.4 * X) + (-1.9 * Y) + (-X^2) + (-Y^2)}) ## show the data head(Z) ## Set-up the rgl device with(Z, plot3d(X, Y, Z1, type = "n")) ## Need a scale for Z2 to display as colours ## Here I choose 10 equally spaced colours from a palette cols <- heat.colors(10) ## Break Z2 into 10 equal regions cuts <- with(Z, cut(Z2, breaks = 10)) ## Add in the surface, colouring by Z2 with(Z, surface3d(1:10,1:10, matrix(Z1, ncol = 10), color = cols[cuts], back = "fill")) with(Z, points3d(X, Y, Z1, size = 5)) ## show grid X,Y,Z1 

Aquí hay una modificación donde la superficie del plano Z1 es curva ( Z3 ).

 ## Set-up the rgl device plotting Z3, a curved surface with(Z, plot3d(X, Y, Z3, type = "n")) with(Z, surface3d(1:10,1:10, matrix(Z3, ncol = 10), color = cols[cuts], back = "fill")) 

El detalle de lo que hice para obtener Z2 probablemente no importe, pero traté de obtener algo como el gráfico al que se vinculó.

Si aún no obtuve lo que desea, ¿puede editar su Q con algunos datos de ejemplo y darnos una mejor idea de lo que quiere?

HTH

Eche un vistazo al example(points3d) .

La página de ayuda r3d muestra cómo dibujar ejes.

 x <- c(0, 10, 0, 0) y <- c(0, 0, 100, 0) z <- c(0, 0, 0, 1) i <- c(1,2,1,3,1,4) labels <- c("Origin", "X", "Y", "Z") text3d(x,y,z,labels) segments3d(x[i],y[i],z[i]) 

Ahora agrega algunos puntos

 dfr <- data.frame(x = 1:10, y = (1:10)^2, z = runif(10), col = rainbow(10)) with(dfr, points3d(x, y, z, col = col))