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

3

я использую

<code>plot3d(x,y,z, col=test$color, size=4) 
</code>

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

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

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

Было бы здорово иметь воспроизводимый пример: with (радужная оболочка, plot3d (Sepal.Length, Sepal.Width, Petal.Length, col = Species)) Etienne Low-Décarie
Это не похоже на работу: iris $ num <-rownames (iris) с библиотекой (iris, plot3d (Sepal.Length, Sepal.Width, Petal.Length, col = Species)) (plyr) d_ply (.data = iris , .variables = "num", function (x) {points3d (x = x $ Sepal.Length, y = x $ Sepal.Width, z = x $ Petal.Length, size = x $ Petal.Width)}) Etienne Low-Décarie

Ваш Ответ

2   ответа
6

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

# Break data.frame into a list of data.frames, each to be plo,tted 
# 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
Большое спасибо, Этьен и Джош, по крайней мере, мне кажется, что я не единственный, кто борется с этим. Кто-нибудь знает, может ли какой-либо другой пакет предоставить эту функцию, потому что я думаю, что это очень полезно? Jack Smith
Hmm. Разве обходной путь не делает это для вас? Какая функциональность вам нужна в вашем 3D-сюжете? Если вам нужна динамическая графика (то есть вращение / масштабирование с помощью мыши), удаление скрытых линий, световые эффекты и т. Д., То вы в значительной степени застряли сrgl. В противном случае вы можете попробовать что-то вродеscatterplot3d. Вполне возможно, что rgl может быть взломан / обновлен, чтобы обеспечить эффективную спецификацию размера для каждой точки, но было бы полезно знать, почему это стоит усилий ... Ben Bolker
Большое спасибо за вашу помощь, извините за поздний ответ! Я знаю, что использовал tet для обозначения точек, потому что адаптировать размер было слишком сложно. Было бы неплохо иметь только одно измерение больше, но, возможно, это было бы слишком много в любом случае ... Jack Smith
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 будет принимать только одиночные числовые значения, выражение или переменная, переданные по размеру в операторе with, должны быть оценены заранее, поэтомуmaterial3d должен по-прежнему видеть только одно значение размера для каждой построенной точки. Просто один на один, так как я потратил около часа на то, чтобы обойти этот обходной путь, прежде чем понял, что он не нужен.

Похожие вопросы