¿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
¿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
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:
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)
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
@YuppieNetworking Gracias y corregido. – csgillespie
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))
No obtengo ninguna resultado con su código – skan
@ 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. –
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
algo como esto. http://addictedtor.free.fr/graphiques/graphcode.php?graph=90 pero es un poco confuso – skan
@ 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? –
Hola, la última línea no funciona, dice Z2 no encontrado. – skan
'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 –