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

时间:2018-02-08 17:14:46

标签: r plot rgl

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

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

enter image description here

是否有某种方法可以设置预定义视图并将绘图导出为常规图像。我希望以自动化的非交互方式为许多数据集执行此操作。

2 个答案:

答案 0 :(得分:1)

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

enter image description here

答案 1 :(得分:1)

除了@ d.b使用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())代替。)

然后你的所有情节都会有相同的方向,但所有这些都是用户可以旋转的。