On Feb 20, 2012, at 9:15 AM, BXC (Bendix Carstensen) wrote:

> Sometimes you want to compute the physical size of a plot based on data.
> In R itself this is no problem.
> 
> But is there a way to compute the values of height and width in S-weave, say:
> 
> <<graph,fig=TRUE,height=xx,width=yy>>=
> 
> where xx and yy are computed and not physically written in the document?
> 
> Bendix

Bendix,

By default, Sweave.sty sets:

\setkeys{Gin}{width=0.8\textwidth}

which modifies the default \includegraphics LaTeX command auto-generated during 
Sweave processing. This means that irrespective of the 'height' and 'width' 
arguments in the figure chunk header, which do control the size of the PDF/EPS 
files created, the actual size of the graphic as included in the resultant 
document will ALWAYS be 80% of the current text width and the height will be 
scaled accordingly.

In general, if you wanted to control the actual height and width of the figure 
in the resultant document, you could set:

<<FigureChunkName,include=false,echo=false,fig=true,height=YourHeight,width=YourWidth>>=

Plot Code Here

@

\begin{figure}[tbp]
\centering
\includegraphics{RnwFileName-FigureChunkName}
\caption[LOF Caption]{Some Longer Caption}
\end{figure}

'RnwFileName' is the name of your working .Rnw Sweave file and 
'FigureChunkName' is the name of the figure chunk and as a result, the graphic 
file name being created by Sweave, separated by the hyphen ('-').

By setting the 'include' option to false, Sweave does not auto-generate the 
\includegraphics line with the "width=0.8\textwidth" argument, and you then 
explicitly include it in the LaTeX code following the figure chunk. The plot 
file(s) would then be created with the height and width parameters in the 
figure chunk header and the resultant document will have a figure of the size 
you desire, overriding the default behavior.

In my .Rnw files, I actually set:

  \usepackage[nogin]{Sweave}

in my preamble, which overrides the default 'Gin' behavior. Then the height and 
width parameters in the figure chunks are reflected in the resultant document, 
but of course, I need to explicitly pre-define those.

If you want to calculate the figure's height and width at run-time, I suspect 
that the only way to do that would be to have your R code generate all of the 
LaTeX code output at runtime as well. So something like the following:

<<CodeChunkName,echo=false>>=

# Plot Size Calculations Here
Height <- ResultOfCalcs
Width <- ResultOfCalcs

pdf("MyPlotFileName.pdf", height = Height, width = Width)

Plot Code Here

dev.off()

cat("\\begin{figure}[tbp]\n")
cat("\\centering\n")
cat("\\includegraphics{MyPlotFileName}\n") 
cat("\\caption[LOF Caption]{Some Longer Caption}\n")
cat("\\end{figure}\n")

@


The result of the cat() function calls will be to output the included character 
vectors to the .tex file being created by Sweave at run-time. So you are using 
R in a normal code chunk to generate LaTeX code.

If you need an EPS file either in place of the PDF (because you are using 
postscript stuff like pstricks) or in addition to the PDF, you can replace the 
pdf() call with postscript() or run a second iteration of the plotting code 
using postscript()/dev.off() as well.

HTH,

Marc Schwartz

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to