R:以非交互方式导出 3D 散点图

R: Export 3D scatterplots non-interactively

在 R 中创建 3D 绘图会打开一个交互式 window,用户可以在其中旋转视图。例如下面使用包 rgl:

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

有什么方法可以设置预定义视图并将绘图导出为常规图像。对于许多数据集,我想以自动化的非交互方式执行此操作。

使用 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()

除了使用 scatterplot3d 而不是 rgl 的@d.b 的回答之外,您还可以使用 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())。)

那么你所有的地块最初都会有相同的方向,但它们都是用户可旋转的。