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

时间:2013-03-22 23:45:01

标签: 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, 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

设置lit=FALSE已经大大减少了文件大小。

我怎样才能减少这个图的大小?

谢谢!

(因为我想在图中添加更多元素,lattice::wireframe不是一个选项。)

1 个答案:

答案 0 :(得分:1)

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

这些碎片在较高放大倍率的pdf中也是可见的,因此我经常在这种情况下使用位图图形(特别是在渲染表面时)。为了得到合适的分辨率,我rgl.snapshot一个大窗口。没有完美,但对我来说是一个有效的妥协(我使用“3d”图的快照而不是引人注目或概述信息,而不是定量可视化)。


检查pdf,我发现每行有2个副本,可能一个用于前面,一个用于后面,或者一个来自每个相邻的多边形。使用frontback参数surface3d点在“邻居多边形”方向上玩一下。