2013-04-21 17 views
6

piszę wniosek i potrzebują 3D działka coś takiego:Atrakcyjna działka 3D w R

enter image description here

ale korzystnie bardziej atrakcyjne. Potrzebuję rozmiaru każdego punktu, aby odzwierciedlić obfitość gatunku i zarys objętości utworzonej przez połączenie punktów.

dane próbki:

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 

Wszelkie sugestie jak zrobić taki wykres bardziej atrakcyjne (być może w tym linie siatki nie chcę żadnych numerów na Jednakże osi?)

Mam bawił scatterplot3d, ale nie wykreślić wszystkie moje punkty i ja osobiście uważam, że kostka ma dziwny wygląd do tego ... jak to nie jest dość dokładne ...

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

Czy możesz pokazać, co próbujesz? –

+0

Oczywiście, po prostu dodaj to teraz. – Elizabeth

+1

Czy to raczej ilustracja niż dokładna fabuła? Jeśli masz tylko cztery obiekty, łatwiej będzie po prostu narysować je z pakietem graficznym. Inną opcją jest pakiet rgl zawierający dynamiczną grafikę 3D. – Spacedman

Odpowiedz

14

To powinno Ci zacząć korzystać z pakietu rgl. Uwaga: Po ponownym przeczytaniu widzę, że używam twoich współrzędnych xyz trochę inaczej niż ty, ale koncepcja jest taka sama.

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) 

Teraz można obrócić wykres interaktywnie, a następnie użyć rgl.snapshot aby uzyskać wydruk (używając Wygładzanie argumenty spheres3d poprawi schemat).

enter image description here

+0

Bardzo ładne! Dzięki, Bryan. Zamiast łączyć centra każdego punktu z liniami, czy mimo wszystko wiesz, aby pokazać objętość, którą te punkty tworzą w przestrzeni 3D (tj. To, co jest znane jako wypukła objętość kadłuba ... zasadniczo umieszczając obkurczanie wokół wszystkich punktów i pokazując "chmura" przestrzeni zajmowanej przez punkty) Przepraszam, moje wyjaśnienie jest nieco szorstkie. Czy wiesz, co mam na myśli? – Elizabeth

+0

Wiem, o czym mówisz, ale nigdy tego nie zrobiłeś. Jestem prawie pewien, że jest zaimplementowany w wielu pakietach: 'install.packages (" sos "); biblioteka ("sos"); findFn ("wypukły kadłub") '. Ale pamiętaj, że twoje punkty są naprawdę kulami wokół punktu, więc zastanów się dokładnie, co taki kurczliwy owijacz przedstawiałby w kategoriach nauki. W zależności od znaczenia twoich wymiarów i rozmiaru kuli, może bardziej odpowiednie byłoby coś w stylu elipsoidy (ale najczęściej wspominam o tym, bo wiem, jak to zrobić!). –

+0

Prawda. Masz więcej niż odpowiedziałeś na moje pytanie, ale teraz będę bezczelny i zapytam, jak zastosować elipsoidę do istniejącego wykresu, pozbyć się liczb na osiach. :) – Elizabeth