2012-05-02 16 views
9

Sono un principiante in R e ho bisogno di un po 'di aiuto per il mio scripting. Sono riuscito a generare gradiente di colore in scala usando la libreria (ggplot2) sui miei grafici 2D come segue;Come assegnare una scala di colori a una variabile in un grafico a dispersione 3D?

z <- c(data$conf) 
d <- qplot(x, y, xlab="Dimension 1", ylab="Dimension 2", colour=z) 
d 
d + scale_colour_gradient(limits=c(0, 1), data=data$conf, low="blue", high="red")) 

Ora sto cercando di riprodurre questo gradiente su un grafico 3D, ho usato scatterplot3d o tracciare3d. Credo che il colorRampPalette crei un gradiente di colore basato su 327 righe (1 ... 327) mentre sono interessato a un gradiente che è funzione dei valori nei dati $ conf. Ho bisogno di una connessione, ma dove?

attach(data) 
t1 <- c(data$conf) 
jet.colors <- colorRampPalette(c("blue", "red")) 
e <- plot3d(x, y, z, col=jet.colors(327)) 

Se potete aiutarmi che sarà grande - o se conoscete qualsiasi pacchetto gradiente trama/scala 3D in grado di fare un lavoro migliore, troppo cool.

risposta

10

Sei sulla strada giusta con colorRampPalette(), ma davvero bisogno di qualcosa di più come colorRamp(), che 'returns a function that maps values between 0 and 1'.

Ancora meglio sarebbe una funzione - chiamare myColorRamp() - che è come colorRamp() ma invece: (a) mappe valori compresi tra min(values) e max(values); e (b) restituisce i colori come stringhe sRGB di 7 caratteri (ad es. "# F60008"), un formato compreso da plot3d().

library(rgl) 

myColorRamp <- function(colors, values) { 
    v <- (values - min(values))/diff(range(values)) 
    x <- colorRamp(colors)(v) 
    rgb(x[,1], x[,2], x[,3], maxColorValue = 255) 
} 

x <- sin((1:100)/10) 
y <- cos((1:100)/10) 
z <- seq(-20, 20, length.out=100) 

cols <- myColorRamp(c("red", "blue"), z) 
plot3d(x = x, y = y, z = z, col = cols) 

enter image description here

+0

Grazie Josh. I risultati sono la proiezione 3D sammon di circa 700 composti con la loro rispettiva probabilità di attraversare la barriera emato-encefalica. – user1369966

+0

Grazie per quello. È sempre (OK, spesso) interessante sapere per che cosa viene effettivamente utilizzata una risposta. –

Problemi correlati