R: Экспортировать трехмерные диаграммы рассеяния неинтерактивно

Создание 3D-графиков в R открывает интерактивное окно, в котором пользователь может поворачивать представление. Например, ниже, используя пакет rgl:

library(rgl)
plot3d(iris[,1:3],col=c("red","green","blue")[iris$Species],size=5)

Есть ли способ установить предопределенное представление и экспортировать график как обычный образ. Я хотел бы сделать это автоматизированным неинтерактивным способом для многих наборов данных.

2 ответа

Используйте пакет scatterplot3d.

library(scatterplot3d)
graphics.off()
png(filename = "test.png", width = 8, height = 6, units = "in", res = 300)
par(mai = c(0.5, 0.5, 0.5, 0.5))
scatterplot3d(x = iris$Sepal.Length, y = iris$Sepal.Width, z = iris$Petal.Length,
 color = c("red","green","blue")[iris$Species],
 cex.symbols = 1, pch = 19, angle = -30)
dev.off()


Кроме @db ответа с использованием scatterplot3d вместо rgl, вы можете сохранить результаты, используя R Markdown. Преимущество этого в том, что вы получаете интерактивный дисплей вместо статического; недостатком является то, что формат HTML, а не PNG или другой формат растрового изображения.

Прежде чем вязать документ, запустите код, подобный этому, и в интерактивном режиме выберите нужный начальный экран:

library(rgl)
options(rgl.useNULL = FALSE)
plot3d(iris[,1:3],col=c("red","green","blue")[iris$Species],size=5)

Как только вы правильно ориентируетесь, запустите этот код:

M <- par3d("userMatrix")
dput(M)

Вы получите что-то вроде

structure(c(0.776694416999817, 0.198224693536758, -0.597873568534851, 
0, -0.629868388175964, 0.249577552080154, -0.735511302947998, 
0, 0.00341932475566864, 0.947849154472351, 0.318700969219208, 
0, 0, 0, 0, 1), .Dim = c(4L, 4L))

как выход. Затем запустите свой документ R Markdown с чем-то вроде

library(rgl)
options(rgl.useNULL = TRUE)
M <- structure(c(0.776694416999817, 0.198224693536758, -0.597873568534851, 
0, -0.629868388175964, 0.249577552080154, -0.735511302947998, 
0, 0.00341932475566864, 0.947849154472351, 0.318700969219208, 
0, 0, 0, 0, 1), .Dim = c(4L, 4L))

(который вы, вероятно, предпочтете не эхо), и в каждом фрагменте кода, который создает график, напишите код следующим образом:

plot3d(iris[,1:3],col=c("red","green","blue")[iris$Species],size=5)
par3d(userMatrix = M)
rglwidget()

(Если это находится в цикле или не находится на верхнем уровне по какой-либо другой причине, вам понадобится print(rglwidget()).)

Тогда все ваши сюжеты первоначально будут иметь одинаковую ориентацию, но все они будут настраиваться пользователем.

licensed under cc by-sa 3.0 with attribution.