2013-04-21 12 views
6

Sto scrivendo una proposta e hanno bisogno di una trama qualcosa 3D come questo:attraente grafico 3D in R

enter image description here

ma preferibilmente più attraente. Ho bisogno della dimensione di ogni punto per riflettere l'abbondanza della specie e un contorno del volume creato collegando i punti.

dati del campione:

input<-data.frame(
label=c("sp1","sp2","sp3","sp4"), 
trait_x=c(6,6,6,1), 
trait_y=c(7,7,7,1), 
trait_z=c(8,8,8,1), 
point_size=c(6,7,8,1) 
) 
input 
    label trait_x trait_y trait_z point_size 
1 sp1  6  7  8  6 
2 sp2  6  7  8  7 
3 sp3  6  7  8  8 
4 sp4  1  1  1  1 

Qualsiasi suggerimento su come fare una tale grafico più interessante (forse compreso griglia Non voglio nessun numeri sugli assi però?)

ho giocato in giro con scatterplot3d, ma non tracciare tutti i miei punti e io personalmente scoprire che il cubo ha un aspetto strano ad esso ... come non è abbastanza preciso ...

library(scatterplot3d) 
x<-input$trait_x 
y<-input$trait_y 
z<-input$trait_z 
scatterplot3d(x,y,z,xlim=c(0,10),ylim=c(0,10),zlim=c(0,10)) 

enter image description here

+0

Puoi mostrare cosa hai provato? –

+0

Certo, aggiungilo ora. – Elizabeth

+1

È più un'illustrazione che una trama esatta? Se hai solo quattro blob, potrebbe essere più semplice disegnarlo con un pacchetto grafico. L'altra opzione è il pacchetto rgl che fa grafica 3d dinamica. – Spacedman

risposta

14

Questo dovrebbe iniziare con l'uso del pacchetto rgl. Nota: rileggendo vedo che sto usando le tue coordinate xyz un po 'diverse da te, ma il concetto è lo stesso.

input<-data.frame(# I adjusted the values for better appearance in demo 
label=c("sp1","sp2","sp3","sp4"), 
trait_x=c(6,7,11,1), 
trait_y=c(10,7,9,1), 
trait_z=c(4,7,6,1), 
point_size=c(6,7,8,1) 
) 
names(input) <- c("name", "x", "y", "z", "radius") 
input$radius <- input$radius*0.2 

require("rgl") 

spheres3d(input[,2:4], radius = input[,5], col = c("red", "green", "blue", "orange"), alpha = 0.5) 
axes3d(box = TRUE) 
title3d(xlab = "x_trait", ylab = "y_trait", zlab = "z_trait") 
text3d(input[1,2:4], texts = "species X") 
# next line is clunky but you can do it more elegantly 
segs <- rbind(input[1:2,2:4], input[2:3,2:4], input[3:4,2:4], input[c(4,1),2:4]) 
segments3d(segs) 

Ora è possibile ruotare il diagramma interattivo e quindi utilizzare rgl.snapshot per ottenere una copia cartacea (con antialias argomenti in spheres3d migliorerà il diagramma).

enter image description here

+0

Molto carina! Grazie Bryan. Invece di connettere i centri di ogni punto con le linee, sai comunque di mostrare il volume che questi punti creano nello spazio 3D (cioè quello che è noto come volume dello scafo convesso ... in pratica posizionando gli strizzacervelli attorno a tutti i punti e mostrando il 'nuvola' di spazio occupata dai punti) Scusa la mia spiegazione è un po 'approssimativa. Sai cosa intendo però? – Elizabeth

+0

So di cosa stai parlando ma non l'ho mai fatto. Sono abbastanza sicuro che sia implementato in una serie di pacchetti: 'install.packages (" sos "); biblioteca ("SOS"); findFn ("scafo convesso") '. Ma ricorda che i tuoi punti sono in realtà sfere intorno a un punto, quindi pensa attentamente a ciò che una pellicola simile potrebbe rappresentare in termini di scienza. A seconda del significato delle tue dimensioni e della dimensione della sfera, forse qualcosa di simile a un ellissoide sarebbe più appropriato (ma soprattutto lo dico perché so come farlo!). –

+0

Vero. Hai più di una risposta alla mia domanda, ma ora sarò sfacciato e chiederò come applicare un ellissoide al grafico esistente, eliminare i numeri sugli assi. :) – Elizabeth