2013-04-21 3 views
6

Я пишу это предложение и потребуется 3D сюжет что-то вроде этого:Привлекательный 3D участок в R

enter image description here

но предпочтительно более привлекательным. Мне нужен размер каждой точки, чтобы отразить обилие вида и контур объема, созданного путем соединения точек.

Образец данных:

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 

Любое предложение о том, как сделать такой график более привлекательным (возможно, в том числе сетки я не хочу никаких цифр на осях однако?)

я играл вокруг с scatterplot3d, но не печатает все мои очки, и я лично считаю, что куб имеет странный взгляд на него ... как это не совсем точно ...

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

Можете ли вы показать, что вы пробовали? –

+0

Конечно, просто добавьте его сейчас. – Elizabeth

+1

Является ли это скорее иллюстрацией, чем точным сюжетом? Если у вас есть только четыре капли, это может быть проще просто нарисовать с помощью графического пакета. Другим вариантом является пакет rgl, который выполняет динамическую 3D-графику. – Spacedman

ответ

14

Это должно заставить вас начать использовать пакет rgl. Примечание. При повторном чтении я вижу, что я использую ваши xyz-системы немного иначе, чем вы, но концепция такая же.

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) 

Теперь вы можете вращать диаграмму в интерактивном режиме, а затем использовать rgl.snapshot, чтобы получить твердую копию (с использованием сглаживать аргументов в spheres3d улучшит схему).

enter image description here

+0

Очень красиво! Спасибо, Брайан. В любом случае, вместо того, чтобы связывать центры каждой точки с линиями, вы знаете, что они отображают объем, который эти точки создают в трехмерном пространстве (то есть то, что известно как объем выпуклого корпуса), в основном размещая термоусадочную пленку вокруг всех точек и отображая «облако» пространства, которое занимают точки) Извините, мое объяснение немного грубо. Вы знаете, что я имею в виду? – Elizabeth

+0

Я знаю, о чем вы говорите, но никогда этого не делал. Я уверен, что он реализован в нескольких пакетах: 'install.packages (« sos »); библиотека ("СОС"); findFn ("выпуклая оболочка") '. Но помните, что ваши точки - это действительно сферы вокруг точки, поэтому тщательно подумайте о том, что такое термоусадочная пленка будет представлять с точки зрения науки. В зависимости от значения ваших измерений и размера сферы, возможно, что-то вроде эллипсоида было бы более подходящим (но в основном я упоминаю об этом, потому что я знаю, как это сделать!). –

+0

Правда. У вас больше, чем ответили на мой вопрос, но теперь я буду наглый и спрошу, как применить эллипсоид к существующему графику, избавиться от чисел на осях. :) – Elizabeth

Смежные вопросы