2010-09-24 25 views
6

¿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?R: gráfico 4D, x, y, z, colores

gracias

+0

'raster :: plot3D' usa 'rgl'. He creado la imagen de los datos de ejemplo aquí: http://stackoverflow.com/questions/5220283/surface-plot-in-r-similar-to-the-one-from-gnuplot –

Respuesta

5

se utiliza una combinación de persp y color de acuerdo a 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:

Sample output

RGL

Es bastante sencillo de usar 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) 
+0

A 5 años demasiado tarde comentario: 'cm.colors (31) [floor (31 * hgt + 1)]' dará algunos valores fuera de límites (NA) ya que 'hgt' puede ser 1. Probablemente signifique' cm. colores (32) [piso (31 * hgt + 1)] '? – YuppieNetworking

+0

@YuppieNetworking Gracias y corregido. – csgillespie

0

Echa un vistazo a example(points3d).

La página de ayuda r3d le 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 se 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)) 
+0

No obtengo ninguna resultado con su código – skan

+0

@ user425895: Debería ver 3 ejes etiquetados y algunos puntos. Compruebe que puede mostrar * cualquier cosa * con 'rgl'. Luego verifique que haya copiado y pegado correctamente. –

2

Hay un ejemplo en dibujar3d si usted está 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 por una cuarta variable, digamos una variable de agrupación, luego 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 de lo que usted quiere?

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 en donde la superficie plana 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 conseguir Z2 probablemente no importa, pero traté de obtener algo así como la gráfica se ha vinculado a.

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

HTH

+0

algo como esto. http://addictedtor.free.fr/graphiques/graphcode.php?graph=90 pero es un poco confuso – skan

+0

@ user425895: He editado mi respuesta para tratar de obtener algo así como el gráfico al que vinculó.¿Es este esfuerzo más como lo que quieres? –

+0

Hola, la última línea no funciona, dice Z2 no encontrado. – skan

Cuestiones relacionadas