如何减少rgl postscript的文件大小?

如何减少rgl postscript的文件大小?,r,rgl,R,Rgl,我使用rgl绘制了一个三维曲面,我想将其保存为pdf格式。尽管绘图相当简单,但文件大小接近1Mb require(rgl) f <- function(x,y) { d <- 3 * sqrt(x*x + y*y) exp(-0.02 * d^2) * sin(d) } x <- y <- seq(-pi, pi, length=50) Grid <- expand.grid(x=x, y=y) z <- matrix(f(Grid$x,

我使用
rgl
绘制了一个三维曲面,我想将其保存为pdf格式。尽管绘图相当简单,但文件大小接近1Mb

require(rgl)

f <- function(x,y) {
    d <- 3 * sqrt(x*x + y*y)
    exp(-0.02 * d^2) * sin(d)
}

x <- y <- seq(-pi, pi, length=50)
Grid <- expand.grid(x=x, y=y)
z <- matrix(f(Grid$x, Grid$y), length(x), length(y))

rgl.open()
rgl.viewpoint(phi=-60, theta=0, fov=30, zoom=.8)
surface3d(x, y, z, color="black", front="lines", lit=FALSE)
rgl.bg(color="white")

Sys.sleep(1) #to give rgl some time to render
rgl.postscript("surface.pdf", fmt="pdf") 
Sys.sleep(1)
print(file.info("surface.pdf")$size)
# 880K
require(rgl)

一般来说,我也更喜欢矢量图形,但这里的情况是rgl渲染场景。这意味着pdf是由许多小块组成的,这就是文件大小快速增长的原因。事实上,你的pdf文件由许多细小的直线组成
lit=FALSE
意味着这些线不会被分割成具有不同颜色的更小的线

这些片段在PDF中以更高的放大率也可见,因此我经常在这种情况下使用位图图形(特别是在渲染曲面时)。为了获得合适的分辨率,我在一个大窗口中创建了一个rgl.snapshot。没有t完美,但对我来说是一个可行的折衷方案(我使用“3d”图形的快照作为吸引眼球的工具或概述信息,而不是定量可视化)



查看pdf,我发现每行有两个副本,可能一个用于前面,一个用于后面,或者每个相邻多边形都有一个副本。使用
surface3d
front
back
参数在“相邻多边形”的方向上进行一点小游戏

为了完整起见,我在放大
rgl
device窗口后尝试了printscreen(是的,击键),删除了边框并保存为PNG。图像文件大约为45 kb,看起来好多了…你说得对,但我更喜欢将我的图形保存为矢量图形。@Ferdinand.kraft,printscreen是否提供了更好的输出
rgl.snapshot()
@本博克,哈哈。称之为“暴力”快照。我不知道这个功能。我试过了,这个文件甚至比从printscreen保存的PNG还要小。谢谢你的解释。我现在明白了,要求OpenGL提供已渲染场景的矢量图形输出没有多大意义。我也同意pdf在放大倍数下看起来不太像矢量图形。然而,我不理解关于“neihbour多边形”的最后一句话。@sieste:我使用
back=“cull”
进行渲染(我认为这应该会抑制生成背景多边形),但仍然发现线条彼此重叠。