2013-04-21 41 views
6

Tôi viết một đề nghị và cần một cái gì đó âm mưu 3D như thế này:cốt truyện 3D hấp dẫn trong R

enter image description here

nhưng tốt nhất là nên hấp dẫn hơn. Tôi cần kích thước của mỗi điểm để phản ánh sự phong phú của các loài và một phác thảo của khối lượng được tạo ra bằng cách kết nối các điểm.

dữ liệu mẫu:

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 

Bất kỳ gợi ý về cách làm cho một đồ thị như vậy hấp dẫn hơn (có lẽ bao gồm gridlines Tôi không muốn bất kỳ con số trên các trục tuy nhiên?)

Tôi đã chơi xung quanh với scatterplot3d, nhưng nó không vẽ tất cả các điểm của tôi và cá nhân tôi thấy rằng các khối lập phương có một cái nhìn xa lạ với nó ... như nó không phải là hoàn toàn chính xác ...

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

Bạn có thể trình bày những gì bạn đã thử không? –

+0

Chắc chắn, chỉ cần thêm nó ngay bây giờ. – Elizabeth

+1

Nó có minh họa nhiều hơn một âm mưu chính xác không? Nếu bạn chỉ có bốn đốm màu trên nó thì có thể dễ dàng hơn khi vẽ nó bằng gói đồ họa. Các tùy chọn khác là gói rgl mà không đồ họa 3d năng động. – Spacedman

Trả lời

14

Điều này sẽ giúp bạn bắt đầu sử dụng gói rgl. Lưu ý: Khi đọc lại, tôi thấy tôi đang sử dụng các hợp âm xyz của bạn hơi khác so với bạn, nhưng khái niệm thì giống nhau.

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) 

Bây giờ bạn có thể xoay sơ đồ của bạn một cách tương tác và sau đó sử dụng rgl.snapshot để có được một bản in (sử dụng antialias luận trong spheres3d sẽ cải thiện sơ đồ).

enter image description here

+0

Rất đẹp! Cảm ơn Bryan. Thay vì kết nối các trung tâm của mỗi điểm với các đường, bạn biết không để hiển thị âm lượng mà các điểm này tạo ra trong không gian 3D (tức là cái được gọi là khối lồi ... về cơ bản đặt bao bọc xung quanh tất cả các điểm và hiển thị 'đám mây' của không gian các điểm chiếm) Xin lỗi giải thích của tôi là một chút thô. Bạn có biết ý tôi là gì không? – Elizabeth

+0

Tôi biết những gì bạn đang nói về nhưng chưa bao giờ thực hiện nó. Tôi khá chắc chắn nó được thực hiện trong một số gói: 'install.packages (" sos "); thư viện ("sos"); findFn ("lồi lồi") '. Nhưng hãy nhớ rằng điểm của bạn thực sự là các hình cầu xung quanh một điểm, vì vậy hãy suy nghĩ cẩn thận về những gì một cái bọc co lại như thế sẽ đại diện cho khoa học. Tùy thuộc vào ý nghĩa của kích thước của bạn và kích thước hình cầu, có thể một cái gì đó giống như một ellipsoid sẽ phù hợp hơn (nhưng chủ yếu là tôi đề cập rằng bởi vì tôi biết làm thế nào để làm điều đó!). –

+0

Đúng. Bạn có nhiều hơn là trả lời câu hỏi của tôi nhưng bây giờ tôi sẽ táo bạo và hỏi làm thế nào để áp dụng một ellipsoid cho đồ thị hiện có, loại bỏ các con số trên các trục. :) – Elizabeth

Các vấn đề liên quan