簡體   English   中英

以 svg 或 pdf 等無損格式保存 rgl 3D 散點圖

[英]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函數使用的參數phitheta

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM