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

4
我希望实现的是,在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。
我的想法是保存当前视图的旋转并将其与另一个函数一起使用,该函数可以生成类似于 plot3D 包中的非交互式 3D 散点图,例如 scatter3D 函数。为了保存旋转矩阵,我执行了以下操作:
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 

我的问题是如何从这个旋转矩阵得到用于scatter3D函数的参数phitheta

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给出极角),所以我需要从3轴旋转转换到与二轴旋转相同的旋转结果。我认为phi的旋转轴是由theta的旋转定义的。
如果有其他方法可以将rgl快照保存为无损格式,我会很高兴了解!

1
您可以通过更改原始rgl窗口的大小来更改快照的分辨率。但是,由于受屏幕尺寸限制,这可能不足够。有时候您可以使用rgl.postscript进行矢量格式处理,但它无法正确处理所有场景。 - user2554330
啊,是的,就是这样。对我有效。我只是没有意识到这个函数已经在包里了。 - nnn
snapshot3d("3d.pdf" fmt = "pdf") 三维快照("3d.pdf" fmt = "pdf") - Andrés Parada
1个回答

4
最新版本的rgl(仅限于R-forge;请参见如何获取最新版本的rgl?)有一个rglToBase()函数,它返回您需要的phi和theta值。还有rgl.postscript(),如我的4月24日评论中所提到的,可以以无损格式保存(但不能保存所有内容)。
编辑后添加:一个非常新的补充是writeASY()函数。这将写出Asymptote源代码以绘制各种格式的图像,主要用于LaTeX文档。请参见http://asymptote.sourceforge.net。虽然仍有一些局限性(不支持子场景,表面照明不完美等),但正在取得进展。欢迎提出建议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接