[英]Save a rgl 3D scatterplot in a lossless format like svg or pdf
我想要實現的是,在 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
函數使用的參數phi
和theta
。
library(plot3D)
# phi = ?
# theta = ?
pdf("scatter3D.pdf")
scatter3D(x, y, z, pch=20, phi = 20, theta =30, col="black")
dev.off()
我知道有數學可以從旋轉矩陣中提取旋轉角度。 我真的不知道如何在我的情況下應用它。 特別是因為矩陣有 4 行和 4 列。 我希望每個都有 3 個......下一個問題是scatter3D
只使用兩個旋轉軸(theta 給出方位角方向,phi 給出坐標),所以我必須從 3 軸旋轉轉換為由 a 產生的相同旋轉兩軸旋轉。 我認為 phi 的旋轉軸是由 theta 的旋轉定義的。
如果有另一種方法可以以無損格式保存 rgl 快照,我很樂意了解它!
rgl 的最新版本(僅限 R- forge ;請參閱如何安裝最新版本的 rgl?了解如何獲取它)版本的 rgl 有一個函數 rglToBase() 可返回您需要的 phi 和 theta 值。 還有我在 4 月 24 日的評論中提到的 rgl.postscript() 以無損格式保存(但不能保存所有內容)。
編輯添加:一個非常新的添加是writeASY()
函數。 這寫出 Asymptote 源代碼來繪制各種格式的圖像,主要用於 LaTeX 文檔。 請參閱http://asymptote.sourceforge.net 。 這仍然有一些限制(不支持子場景,表面照明不完美等)但它正在實現。 歡迎提出建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.