Potresti fornirmi un esempio su come utilizzare rgl per tracciare 3 variabili sugli assi x, yez e una quarta con colori diversi?R: trama 4D, x, y, z, colori
grazie
Potresti fornirmi un esempio su come utilizzare rgl per tracciare 3 variabili sugli assi x, yez e una quarta con colori diversi?R: trama 4D, x, y, z, colori
grazie
si utilizza una combinazione di persp
e colore secondo una funzione separata. Ecco qualche esempio di codice:
## 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)
Questo dà:
RGL
E 'abbastanza semplice da utilizzare la tecnica di cui sopra con la libreria 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)
Un commento di 5 anni troppo tardi: 'cm.colors (31) [floor (31 * hgt + 1)]' fornirà alcuni valori fuori limite (NA) poiché 'hgt' può essere 1. Probabilmente si intende' cm. colors (32) [floor (31 * hgt + 1)] '? – YuppieNetworking
@YuppieNetworking Grazie e risolto. – csgillespie
Date un'occhiata a example(points3d)
.
La pagina di guida r3d
mostra come disegnare gli assi.
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])
Ora si aggiungono alcuni punti
dfr <- data.frame(x = 1:10, y = (1:10)^2, z = runif(10), col = rainbow(10))
with(dfr, points3d(x, y, z, col = col))
Non ne ho risultato con il tuo codice – skan
@ user425895: dovresti vedere 3 assi etichettati e alcuni punti. Verifica di poter visualizzare * qualsiasi cosa * con 'rgl'. Quindi controlla di averlo copiato e incollato correttamente. –
c'è un esempio in tracciare3d se si sta parlando di tracciare punti in uno spazio 3D e colorare:?
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col=rainbow(1000))
Ma se intendi colorare i punti con una quarta variabile, ad esempio una variabile di raggruppamento, quindi possiamo modificare l'esempio sopra per farlo creando una variabile di raggruppamento
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, è più questo quello che vuoi?
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
Ecco una variante in cui la superficie piana Z1
è 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"))
Il dettaglio di quello che ho fatto per ottenere Z2
probabilmente non importa, ma ho cercato di ottenere qualcosa di simile il grafico si è collegato al.
Se non ho ancora ottenuto ciò che desideri, puoi modificare la tua Q con alcuni dati di esempio e darci un'idea migliore di ciò che desideri?
HTH
qualcosa di simile. http://addictedtor.free.fr/graphiques/graphcode.php?graph=90 ma è un po 'di confusione – skan
@ user425895: Ho modificato la mia risposta per cercare di ottenere qualcosa come il grafico a cui ti sei collegato.Questo sforzo è più come quello che vuoi? –
Ciao, l'ultima riga non funziona, dice Z2 non trovata. – skan
'raster :: plot3D' usa 'rgl'. Ho creato l'immagine dei dati di esempio qui: http://stackoverflow.com/questions/5220283/surface-plot-in-r-similar-to-the-one-from-gnuplot –