3

所以我正在使用 Sweave 创建 pdf,其中包括一些上面有大量点的图表。我可以很好地获得 pdf,但它似乎已经创建了很多层,因此很难在 Acrobat 或 Reader 中打开文件。当我这样做时,我真的可以看到文件上加载的点。

有没有办法在 Sweave 中展平 pdf 以使其不那么笨重?

(请注意,我正在使用 RStudio。我知道我可能应该使用其他东西,但我还没有找到任何可以顺利运行的东西。)

4

3 回答 3

5

没有必要为此切换到 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()示例。

于 2012-10-29T09:39:12.373 回答
4

正如已经提到的,您可能应该切换到knitr,这使得 pdf 和其他格式之间的交换变得更好。特别是,您应该查看:

  • knitr 和 sweave 之间的过渡指南
  • 全局选项:这样您就可以轻松地在 pdf、高分辨率 png 和低分辨率 png 之间进行切换。
  • 缓存:仅在需要时生成数字。

以下是使用 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=TRUEfor knitr。如果包中的 PNG 设备的图像质量graphics不够,您可以轻松切换到其他 PNG 设备,例如dev='CairoPNG''Cairo_png'. 在 Sweave 中,您只需编写更多代码来做同样的事情。

于 2012-10-29T09:17:24.707 回答
4

正如加文所说,没有必要为此切换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。

于 2012-10-29T16:05:32.360 回答