以无损格式保存rgl 3D散点图,如svg或pdf

时间:2016-04-23 07:36:11

标签: r rgl scatter3d

我想要实现的是,要在rgl中显示3D图形,将其旋转到我想要显示的视图中,然后将其保存到文件中。我知道我可以使用rgl.snapshot函数执行此操作:

library(rgl)

x <- runif(20)
y <- runif(20)
z <- runif(20)
plot3d(x, y, z)
rgl.snapshot("rgl.snapshot.png")

问题是,rgl.snapshot会在屏幕分辨率中生成一个文件,因此打印的分辨率不够高。我无法影响文件保存的分辨率。一般来说,如果我能够以pdf或svg等矢量格式保存文件,那就更好了。

我的想法是保存当前视图的旋转,并将其与另一个函数一起使用,该函数生成scatter3D包中的plot3D非交互式三维散点图。为了保存旋转矩阵,我做了以下几点:

rotationMatrix <- rgl.projection()

你也可以这样做:

rotationMatrix <- par3d()$modelMatrix

旋转矩阵如下所示:

$model
          [,1]       [,2]      [,3]       [,4]
[1,] 0.9584099  0.0000000 0.0000000 -0.4726846
[2,] 0.0000000  0.3436644 0.9792327 -0.6819317
[3,] 0.0000000 -0.9442102 0.3564116 -3.6946754
[4,] 0.0000000  0.0000000 0.0000000  1.0000000

$proj
         [,1]     [,2]      [,3]      [,4]
[1,] 3.732051 0.000000  0.000000   0.00000
[2,] 0.000000 3.732051  0.000000   0.00000
[3,] 0.000000 0.000000 -3.863703 -14.36357
[4,] 0.000000 0.000000 -1.000000   0.00000

$view
     x      y  width height 
     0      0    256    256 

现在我的问题是我如何从这个旋转矩阵到phi函数使用的参数thetascatter3D

library(plot3D)

# phi = ?
# theta = ?
pdf("scatter3D.pdf")
scatter3D(x, y, z, pch=20, phi = 20, theta =30, col="black")
dev.off()

我知道有数学可以从旋转矩阵中提取旋转角度。我真的不知道如何在我的情况下应用它。特别是因为矩阵具有4行和列。我希望每个中有3个...下一个问题是scatter3D只使用两个旋转轴(theta给出方位角方向,phi是colatitude),所以我必须从3轴旋转转换为相同由两轴旋转产生的旋转。我认为phi的旋转轴是由θ的旋转定义的。

如果还有另一种以无损格式保存rgl快照的方法,我很乐意了解它!

1 个答案:

答案 0 :(得分:2)

最新版本(仅限R-forge;请参阅How do I install the latest version of rgl?了解如何获取它)rgl版本有一个函数rglToBase(),它返回您需要的phi和theta值。还有我在4月24日评论中提到的rgl.postscript()以无损格式保存(但无法保存所有内容)。

编辑添加:writeASY()功能是一个非常新的添加。这写出Asymptote源代码以各种格式绘制图像,主要用于LaTeX文档。见http://asymptote.sourceforge.net。这仍然有点受限(不支持子场景,表面照明不完美等),但它已经到了那里。建议是值得欢迎的。