Вот работа вокруг тех же линий, предложенных Этьеном. Основная идея состоит в том, чтобы настроить график, а затем использовать отдельный вызов 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
Это здорово иметь воспроизводимый пример: с (iris, plot3d (Sepal.Length, Sepal.Width, Petal.Length, col = Виды)) –
Это не работает: 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)}) –