所以我正在使用 Sweave 创建 pdf,其中包括一些上面有大量点的图表。我可以很好地获得 pdf,但它似乎已经创建了很多层,因此很难在 Acrobat 或 Reader 中打开文件。当我这样做时,我真的可以看到文件上加载的点。
有没有办法在 Sweave 中展平 pdf 以使其不那么笨重?
(请注意,我正在使用 RStudio。我知道我可能应该使用其他东西,但我还没有找到任何可以顺利运行的东西。)
没有必要为此切换到 Knitr,尽管这样做有很多好处。
一种解决方案是安排生成绘图文件,然后自己包含它,而不是依靠 Sweave 为您完成
<<gen_fig, echo=true, eval=true>>=
png("path/to/fig/location/my_fig.png")
plot(1:10)
dev.off()
@
\includegraphics[options_here]{path/to/fig/location/my_fig}
另一种选择是考虑带有“大量点”的图是否是一个有用的数字——你能看到所有的点吗?是兴趣点的密度吗?替代方法包括通过hexbin包进行绘图或生成点的二维密度并将其绘制为较低密度的点集。ggplot2包内置了很多这样的功能,参见例如stat__bin2d()
或stat_binhex()
示例。
正如已经提到的,您可能应该切换到knitr,这使得 pdf 和其他格式之间的交换变得更好。特别是,您应该查看:
以下是使用 PNG 设备的示例:
\documentclass{article}
\begin{document}
<<gen_fig, dev='png'>>=
n <- 100000
DF <- data.frame(x=rnorm(n), y=rnorm(n))
plot(DF)
@
\end{document}
无需指定fig=TRUE
for knitr
。如果包中的 PNG 设备的图像质量graphics
不够,您可以轻松切换到其他 PNG 设备,例如dev='CairoPNG'
或'Cairo_png'
. 在 Sweave 中,您只需编写更多代码来做同样的事情。
正如加文所说,没有必要为此切换knitr
,尽管这样做还有其他优势。但是,您甚至不需要编写自己的保存和包含代码;Sweave 可以为您做到这一点。如果初始文件是:
\documentclass{article}
\usepackage[american]{babel}
\begin{document}
<<>>=
n <- 100000
DF <- data.frame(x=rnorm(n), y=rnorm(n))
@
<<gen_fig, fig=TRUE>>=
plot(DF)
@
\end{document}
然后只需将参数更改为图形块,您就可以获得 PNG 而不是 PDF:
<<gen_fig, fig=TRUE, png=TRUE, pdf=FALSE>>=
plot(DF)
@
在这个简单的示例中,它将我的最终 PDF 从 685K 缩小到 70K。