Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making flattened pdfs in Sweave

So I am creating pdfs using Sweave that include some graphs that have a ton of points on them. I can get the pdf well enough, but it seems to have created it with a ton of layers, so it's hard to open the file in Acrobat or Reader. When I do, I literally can watch the points load on the document.

Is there a way to flatten the pdf in Sweave so that it's not so bulky?

(Note that I am using RStudio. I know I should probably be using something else, but I haven't found anything that has worked this smoothly yet.)

like image 242
RickyB Avatar asked Dec 09 '25 15:12

RickyB


2 Answers

There is no need to switch to Knitr for this, though there are plenty of advantages in doing so.

One solution is just to arrange for the plot file to be produced and then include it yourself rather than rely on Sweave to do it for you

<<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}

Another option is to consider whether a plot with a "ton of points" is a useful figure - can you see all the points? Is the density of the points of interest? Alternatives include plotting via the hexbin package or generating a 2-d density of the points and plotting that as a lower-density set of points. The ggplot2 package has plenty of this functionality built in, see e.g. stat__bin2d() or stat_binhex() for examples.

like image 189
Gavin Simpson Avatar answered Dec 12 '25 07:12

Gavin Simpson


As Gavin said, there is no need to switch to knitr for this, though there are other advantages to do so. However, you don't even need to write your own saving and including code; Sweave can do that for you. If the initial document is:

\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}

Then just by changing the arguments to the figure chunk, you can get a PNG instead of a PDF:

<<gen_fig, fig=TRUE, png=TRUE, pdf=FALSE>>=
plot(DF)
@

In this simple example, it shrinks my final PDF from 685K to 70K.

like image 23
Brian Diggs Avatar answered Dec 12 '25 08:12

Brian Diggs