2012-04-26 2 views
3

Я использую3d scatterplot в R с использованием rgl plot3d - разный размер для каждой точки данных?

plot3d(x,y,z, col=test$color, size=4) 

для построения 3D-диаграммы рассеяния моего набора данных с R, но с rglsize аргумент принимает только один размер.

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

Спасибо за ваши идеи!

+0

Это здорово иметь воспроизводимый пример: с (iris, plot3d (Sepal.Length, Sepal.Width, Petal.Length, col = Виды)) –

+1

Это не работает: iris $ num <-rownames (радужной оболочки) с (радужной оболочки глаза, Plot3D (Sepal.Length, Sepal.Width, Petal.Length, Col = Вид)) библиотека (plyr) d_ply (.data = ирис, .variables = "номер", function (x) {points3d (x = x $ Sepal.Length, y = x $ Sepal.Width, z = x $ Petal.Length, size = x $ Petal.Width)}) –

ответ

6

Вот работа вокруг тех же линий, предложенных Этьеном. Основная идея состоит в том, чтобы настроить график, а затем использовать отдельный вызов points3d() для построения точек в каждом классе размеров.

# Break data.frame into a list of data.frames, each to be plotted 
# with points of a different size 
size <- as.numeric(cut(iris$Petal.Width, 7)) 
irisList <- split(iris, size) 

# Setup the plot 
with(iris, plot3d(Sepal.Length, Sepal.Width, Petal.Length, col=Species, size=0)) 

# Use a separate call to points3d() to plot points of each size 
for(i in seq_along(irisList)) { 
    with(irisList[[i]], points3d(Sepal.Length, Sepal.Width, 
           Petal.Length, col=Species, size=i)) 
} 

(FWIW, действительно кажется, что нет никакого способа, чтобы получить plot3d() сделать это непосредственно. Проблема заключается в том, что plot3d() использует вспомогательную функцию material3d(), чтобы установить размеры точек и, как показано ниже, material3d() только хочет принимать одно числовое значение.)

material3d(size = 1:7) 
# Error in rgl.numeric(size) : size must be a single numeric value 
+0

Большое спасибо Etienne и Джош, по крайней мере кажется, что я не единственный, кто борется с этим. Кто-нибудь знает, может ли какой-либо другой пакет предоставить эту функциональность, потому что я считаю, что это очень полезно? –

+1

Хм. Не оборачивается ли это обходным путем? Какая функциональность вам нужна в 3D-графике? Если вам нужна динамическая графика (т. Е. Вращать/масштабировать мышью), удаление скрытых линий, эффекты освещения и т. Д., То вы в значительной степени застреваете с 'rgl'. В противном случае вы можете попробовать что-то вроде 'scatterplot3d'. Возможно, что rgl можно взломать/обновить, чтобы обеспечить эффективную спецификацию размера для каждой точки, но было бы полезно знать, почему это стоит усилий ... –

+0

Большое спасибо за вашу помощь, извините за поздний ответ! Я знаю, что просто использовал tet для маркировки очков, потому что для адаптации размер был слишком сложным. Было бы неплохо иметь только одно измерение больше, но, возможно, это было бы слишком много ... –

0

Только в случае, если кто-либо другой натыкается в конце этого года, то теперь вполне возможно передать переменную в аргумент размера, например, with(test, plot3d(x,y,z, col=test$color, size=test$size)).

На самом деле, вы можете выполнять операции с данными, подаваемыми по размеру, и он также будет работать. Мне удалось сделать базовое соотношение размеров с чем-то вроде строк size = x/(max(x,na.rm=TRUE)-min(x,na.rm=TRUE)).

Хотя верно, что material3d будет принимать только одно числовые значения, выражение или переменная, поданная в размер внутри оператора, должны быть предварительно оценены, поэтому material3d все равно должен видеть только одно значение размера для каждой начерченной точки. Просто хедз-ап, так как я провел час или около того, возившись с обходным решением, размещенным здесь, прежде чем осознать, что это не нужно.

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