我使用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
不是一个选项。)
答案 0 :(得分:1)
一般来说我也喜欢矢量图形,但这里的情况是rgl呈现场景。这意味着pdf由许多小块组成 - 这就是文件大小快速增长的原因。事实上,你的pdf包含许多细小的直线。 lit = FALSE
表示这些线条不会分成更细的线条,颜色也不同。
这些碎片在较高放大倍率的pdf中也是可见的,因此我经常在这种情况下使用位图图形(特别是在渲染表面时)。为了得到合适的分辨率,我rgl.snapshot
一个大窗口。没有完美,但对我来说是一个有效的妥协(我使用“3d”图的快照而不是引人注目或概述信息,而不是定量可视化)。
检查pdf,我发现每行有2个副本,可能一个用于前面,一个用于后面,或者一个来自每个相邻的多边形。使用front
和back
参数surface3d
点在“邻居多边形”方向上玩一下。