#LyX 2.1 created this file. For more info see http://www.lyx.org/
\lyxformat 474
\begin_document
\begin_header
\textclass tufte-handout
\begin_preamble
\renewcommand{\textfraction}{0.05}
\renewcommand{\topfraction}{0.8}
\renewcommand{\bottomfraction}{0.8}
\renewcommand{\floatpagefraction}{0.75}

\usepackage[buttonsize=1em]{animate}
\end_preamble
\options justified
\use_default_options true
\begin_modules
knitr
\end_modules
\maintain_unincluded_children false
\language english
\language_package none
\inputencoding default
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_math auto
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref true
\pdf_bookmarks true
\pdf_bookmarksnumbered true
\pdf_bookmarksopen true
\pdf_bookmarksopenlevel 2
\pdf_breaklinks true
\pdf_pdfborder false
\pdf_colorlinks false
\pdf_backref false
\pdf_pdfusetitle true
\pdf_quoted_options "pdfstartview=FitH"
\papersize default
\use_geometry true
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 2
\tocdepth 2
\paragraph_separation indent
\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header

\begin_body

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<setup, include=FALSE, cache=FALSE>>=
\end_layout

\begin_layout Plain Layout

library(knitr)
\end_layout

\begin_layout Plain Layout

options(formatR.arrow=TRUE,width=50)
\end_layout

\begin_layout Plain Layout

opts_chunk$set(fig.path='figure/graphics-', cache.path='cache/graphics-',
 fig.align='center', dev='tikz', fig.width=5, fig.height=5, fig.show='hold',
 cache=TRUE, par=TRUE)
\end_layout

\begin_layout Plain Layout

knit_hooks$set(par=function(before, options, envir){
\end_layout

\begin_layout Plain Layout

if (before && options$fig.show!='none') par(mar=c(4,4,.1,.1),cex.lab=.95,cex.axis=.9,mg
p=c(2,.7,0),tcl=-.3)
\end_layout

\begin_layout Plain Layout

}, crop=hook_pdfcrop)
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Title
knitr Graphics Manual
\end_layout

\begin_layout Author
Yihui Xie
\end_layout

\begin_layout Abstract
This manual shows features of graphics in the 
\series bold
knitr
\series default
 package (version 
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
Sexpr{packageVersion('knitr')}
\end_layout

\end_inset

) in detail, including the graphical devices, plot recording, plot rearrangement
, control of plot sizes, the tikz device, figure captions, animations and
 other types of plots such as 
\series bold
rgl
\series default
 or GGobi plots.
\end_layout

\begin_layout Standard
Before reading this specific manual
\begin_inset Foot
status open

\begin_layout Plain Layout
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://bit.ly/knitr-graphics-src
\end_layout

\end_inset

 (Rnw source)
\end_layout

\end_inset

, you must have finished the main manual
\begin_inset Foot
status open

\begin_layout Plain Layout
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://bit.ly/knitr-main
\end_layout

\end_inset


\end_layout

\end_inset

.
\end_layout

\begin_layout Section
Graphical Devices
\end_layout

\begin_layout Standard
The 
\series bold
knitr
\series default
 package comes with more than 20 built-in graphical devices, and you can
 specify them through the 
\family typewriter
dev
\family default
 option.
 This document uses the global option 
\family typewriter
dev='tikz'
\family default
, i.e., the plots are recorded by the tikz device by default, but we can change
 the device locally.
 Since tikz will be used extensively throughout this manual and you will
 see plenty of tikz graphics later, now we first show a few other devices.
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<test-plot, eval=FALSE>>=
\end_layout

\begin_layout Plain Layout

with(trees, symbols(Height, Volume, circles = Girth/16, inches = FALSE,
 bg = 'deeppink', fg = 'gray30'))
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Float marginfigure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<pdf-dev, ref.label='test-plot', dev='pdf', out.width='
\backslash

\backslash
linewidth', echo=FALSE>>=
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
The default PDF device.
\begin_inset CommandInset label
LatexCommand label
name "mar:pdf-dev"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Float marginfigure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<png-dev, ref.label='test-plot', dev='png', out.width='
\backslash

\backslash
linewidth', echo=FALSE>>=
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
The PNG device.
\begin_inset CommandInset label
LatexCommand label
name "mar:png-dev"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "mar:pdf-dev"

\end_inset

 and 
\begin_inset CommandInset ref
LatexCommand ref
reference "mar:png-dev"

\end_inset

 show two standard devices in the 
\series bold
grDevices
\series default
 package.
 We can also use devices in the 
\series bold
Cairo
\series default
 or 
\series bold
cairoDevice
\series default
 package, e.g., the chunk below uses the 
\emph on
CairoPNG()
\emph default
 device in the 
\series bold
Cairo
\series default
 package.
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<cairo-png-dev, ref.label='test-plot', dev='CairoPNG', out.width='.5
\backslash

\backslash
linewidth', echo=FALSE>>=
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Section
Plot Recording
\end_layout

\begin_layout Standard
As mentioned in the main manual, 
\series bold
knitr
\series default
 uses the 
\series bold
evaluate
\series default
 package to record plots.
 There are two sources of plots: first, whenever 
\emph on
plot.new()
\emph default
 or 
\emph on
grid.newpage()
\emph default
 is called, 
\series bold
evaluate
\series default
 will try to save a snapshot of the current plot
\begin_inset Foot
status open

\begin_layout Plain Layout
For technical details, see 
\family typewriter
?setHook
\family default
 and 
\family typewriter
?recordPlot
\end_layout

\end_inset

; second, after each complete expression is evaluated, a snapshot is also
 saved.
 To speed up recording, the null graphical device 
\family typewriter
pdf(file = NULL)
\family default
 is used.
 Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:two-high"

\end_inset

 shows two expressions producing two high-level plots.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<two-high, fig.width=3, fig.height=2.5, out.width='.49
\backslash

\backslash
linewidth'>>=
\end_layout

\begin_layout Plain Layout

plot(cars)
\end_layout

\begin_layout Plain Layout

boxplot(cars$dist,xlab='dist')
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
Two high-level plots are captured.
 The key to arrange two plots side by side is to specify the 
\family typewriter
out.width
\family default
 option so that each plot takes less than half of the line width.
 We do not have to use the 
\family typewriter
par(mfrow)
\family default
 trick, and it may not work in some cases (e.g.
 to put base graphics and 
\series bold
ggplot2
\series default
 side by side; recall Figure 1 in the main manual).
\begin_inset CommandInset label
LatexCommand label
name "fig:two-high"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:low-plot-loop"

\end_inset

 shows another example of two R expressions, but the second expression only
 involves with low-level plotting changes.
 By default, low-level plot changes are discarded, but you can retain them
 with the option 
\family typewriter
fig.keep='all'
\family default
.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<low-plot-loop, fig.width=3, fig.height=2.5, out.width='.49
\backslash

\backslash
linewidth', fig.keep='all'>>=
\end_layout

\begin_layout Plain Layout

plot(0,0,type='n',ann=FALSE)
\end_layout

\begin_layout Plain Layout

for(i in seq(0, 2*pi,length=20)) {points(cos(i),sin(i))}
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
Two complete R expressions will produce at most two plots, as long as there
 are not multiple high-level plotting calls in each expression; option 
\family typewriter
fig.keep='all'
\family default
 here.
\begin_inset CommandInset label
LatexCommand label
name "fig:low-plot-loop"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Together with 
\family typewriter
fig.show='asis'
\family default
, we can show the process of plotting step by step like Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:high-with-low"

\end_inset

.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<high-with-low, fig.width=3, fig.height=2.5, out.width='.5
\backslash

\backslash
linewidth', fig.keep='all', fig.show='asis'>>=
\end_layout

\begin_layout Plain Layout

plot(cars)
\end_layout

\begin_layout Plain Layout

abline(lm(dist~speed, data=cars))  # a regression line
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
Low-level plot changes in base graphics can be recorded separately, and
 plots can be put in the places where they were produced.
\begin_inset CommandInset label
LatexCommand label
name "fig:high-with-low"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
A further note on plot recording: 
\series bold
knitr
\series default
 examines all recorded plots (as R objects) and compares them sequentially;
 if the previous plot is a 
\begin_inset Quotes eld
\end_inset

subset
\begin_inset Quotes erd
\end_inset

 of the next plot (= previous plot + low-level changes), the previous plot
 will be removed when 
\family typewriter
fig.keep='high'
\family default
.
 If two successive plots are identical, the second one will be removed by
 default, so it might be a little bit surprising that the following chunk
 will only produce one plot by default
\begin_inset Foot
status open

\begin_layout Plain Layout
adapted from 
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

https://github.com/yihui/knitr/issues/41
\end_layout

\end_inset


\end_layout

\end_inset

:
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<identical-plots,eval=FALSE>>=
\end_layout

\begin_layout Plain Layout

m = matrix(1:100, ncol = 10)
\end_layout

\begin_layout Plain Layout

image(m)
\end_layout

\begin_layout Plain Layout

image(m*2)  # exactly the same as previous plot
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Section
Plot Rearrangement
\end_layout

\begin_layout Standard
We can rearrange the plots in chunks in several ways.
 They can be inserted right after the line(s) of R code which produced them,
 or accumulated till the end of the chunk.
 There is an example in the main manual demonstrating 
\family typewriter
fig.show='asis'
\family default
 for two high-level plots, and Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:high-with-low"

\end_inset

 in this manual also demonstrates this option for a high-level plot followed
 by a low-level change.
\end_layout

\begin_layout Standard
Here is an example demonstrating the option 
\family typewriter
fig.keep='last'
\family default
 (only the last plot is kept):
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<fig-last, fig.width=5.2, fig.height=3, out.width='.7
\backslash

\backslash
linewidth', fig.keep='last', message=FALSE>>=
\end_layout

\begin_layout Plain Layout

library(ggplot2)
\end_layout

\begin_layout Plain Layout

pie <- ggplot(diamonds, aes(x = factor(1), fill = cut)) + xlab('cut') +
 geom_bar(width = 1) 
\end_layout

\begin_layout Plain Layout

pie + coord_polar(theta = "y") # a pie chart
\end_layout

\begin_layout Plain Layout

pie + coord_polar() # the bullseye chart 
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
Two plots were produced in this chunk, but only the last one is kept.
 This can be useful when we experiment with many plots, but only want the
 last result.
 (Adapted from the 
\series bold
ggplot2
\series default
 website)
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
When multiple plots are produced by a code chunk, we may want to show them
 as an animation with the option 
\family typewriter
fig.show='animate'
\family default
.
 Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:clock-animation"

\end_inset

 shows a simple clock animation; you may compare the code to Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:high-with-low"

\end_inset

 to understand that high-level plots are always recorded, regardless of
 where they appeared.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<clock-animation, fig.width=3, fig.height=3, out.width='.4
\backslash

\backslash
linewidth', fig.show='animate', tidy=FALSE, crop=TRUE>>=
\end_layout

\begin_layout Plain Layout

par(mar = rep(3, 4))
\end_layout

\begin_layout Plain Layout

for (i in seq(pi/2, -4/3 * pi, length = 12)) {
\end_layout

\begin_layout Plain Layout

    plot(0, 0, pch = 20, ann = FALSE, axes = FALSE)
\end_layout

\begin_layout Plain Layout

    arrows(0, 0, cos(i), sin(i))
\end_layout

\begin_layout Plain Layout

    axis(1, 0, "VI"); axis(2, 0, "IX")
\end_layout

\begin_layout Plain Layout

    axis(3, 0, "XII"); axis(4, 0, "III"); box()
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
A clock animation.
 You have to view it in Adobe Reader: click to play/pause; there are also
 buttons to speed up or slow down the animation.
\begin_inset CommandInset label
LatexCommand label
name "fig:clock-animation"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
We can also set the alignment of plots easily with the 
\family typewriter
fig.align
\family default
 option; this document uses 
\family typewriter
fig.align='center'
\family default
 as a global option, and we can also set plots to be left/right-aligned.
 Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:maruko-plot"

\end_inset

 is an example of a left-aligned plot.
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<maruko-plot, fig.width=7, fig.height=4, out.width='.45
\backslash

\backslash
linewidth', fig.align='left', crop=TRUE>>=
\end_layout

\begin_layout Plain Layout

stars(cbind(1:16,10*(16:1)),draw.segments=TRUE)
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
A left-aligned plot adapted from 
\family typewriter
?stars
\family default
 (I call this the 
\begin_inset Quotes eld
\end_inset

Maruko
\begin_inset Quotes erd
\end_inset

 plot, and it is one of my favorites; see 
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://en.wikipedia.org/wiki/Chibi_Maruko-chan
\end_layout

\end_inset

).
\begin_inset CommandInset label
LatexCommand label
name "fig:maruko-plot"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Section
Plot Size
\end_layout

\begin_layout Standard
We have seen several examples in which two or more plots can be put side
 by side, and this is because the plots were resized in the output document;
 with the chunk option 
\family typewriter
out.width
\family default
 less than half of the line width, LaTeX will arrange two plots in one line;
 if it is less than 
\begin_inset Formula $1/3$
\end_inset

 of the line width, three plots can be put in one line.
 Of course we can also set it to be an absolute width like 
\family typewriter
3in
\family default
 (3 inches).
 This option is used extensively in this document to control the size of
 plots in the output document.
\end_layout

\begin_layout Section
The tikz Device
\end_layout

\begin_layout Standard
The main advantage of using tikz graphics is the consistency of styles between
 texts in plots and those in the main document.
 Since we can use native LaTeX commands in plots, the styles of texts in
 plots can be very sophisticated (see Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:math-formula-tt"

\end_inset

 for an example).
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout

<<math-formula-tt, fig.width=6, fig.height=2, out.width='
\backslash

\backslash
linewidth'>>=
\end_layout

\begin_layout Plain Layout

plot(0:1,0:1,type='n', ylab='origin of statistics', xlab='statistical presentati
on rocks with 
\backslash

\backslash
LaTeX{}')
\end_layout

\begin_layout Plain Layout

text(.5,c(.8,.5,.2), c('
\backslash

\backslash
texttt{lm(y 
\backslash

\backslash
textasciitilde{} x)}', '$
\backslash

\backslash
hat{
\backslash

\backslash
beta}=(X^{
\backslash

\backslash
prime}X)^{-1}X^{
\backslash

\backslash
prime}y$',  '$(
\backslash

\backslash
Omega,
\backslash

\backslash
mathcal{F},
\backslash

\backslash
mu)$'))
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
A plot created by 
\series bold
tikzDevice
\series default
 with math expressions and typewriter fonts.
 Note the font style consistency -- we write the same expressions in LaTeX
 here: 
\begin_inset Formula $\hat{\beta}=(X^{\prime}X)^{-1}X^{\prime}y$
\end_inset

 and 
\begin_inset Formula $(\Omega,\mathcal{F},\mu)$
\end_inset

; also 
\family typewriter
lm(y ~ x)
\family default
.
\begin_inset CommandInset label
LatexCommand label
name "fig:math-formula-tt"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
When using XeLaTeX instead of PDFLaTeX to compile the document, we need
 to tell the 
\series bold
tikzDevice
\series default
 package by setting the 
\family typewriter
tikzDefaultEngine
\family default
 option before all plot chunks (preferably in the first chunk):
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<xetex-tikz, eval=FALSE>>=
\end_layout

\begin_layout Plain Layout

options(tikzDefaultEngine='xetex')
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Standard
This is useful and often necessary to compile tikz plots which contain (UTF8)
 multi-byte characters.
\end_layout

\begin_layout Section
Figure Caption
\end_layout

\begin_layout Standard
If the chunk option 
\family typewriter
fig.cap
\family default
 is not 
\family typewriter
NULL
\family default
 or 
\family typewriter
NA
\family default
, the plots will be put in a 
\family typewriter
figure
\family default
 environment when the output format is LaTeX, and this option is used to
 write a caption in this environment using 
\family typewriter

\backslash
caption{}
\family default
.
 The other two related options are 
\family typewriter
fig.scap
\family default
 and 
\family typewriter
fig.lp
\family default
 which set the short caption and a prefix string for the figure label.
 The default short caption is extracted from the caption by truncating it
 at the first period or colon or semi-colon.
 The label is a combination of 
\family typewriter
fig.lp
\family default
 and the chunk label.
 Because 
\family typewriter
figure
\family default
 is a float environment, it can float away from the chunk output to other
 places such as the top or bottom of a page when the TeX document is compiled.
\end_layout

\begin_layout Section
Other Features
\end_layout

\begin_layout Standard
The 
\series bold
knitr
\series default
 package can be extended with hook functions, and here I give a few examples
 illustrating the flexibility.
\end_layout

\begin_layout Subsection
Cropping PDF Graphics
\end_layout

\begin_layout Standard
Some R users may have been suffering from the extra margins in R plots,
 especially in base graphics (
\series bold
ggplot2
\series default
 is much better in this aspect).
 The default graphical option 
\family typewriter
mar
\family default
 is about 
\family typewriter
c(5, 4, 4, 2)
\family default
 (see 
\family typewriter
?par
\family default
), which is often too big.
 Instead of endlessly setting 
\family typewriter
par(mar)
\family default
, you may consider the program 
\family typewriter
pdfcrop
\family default
, which can crop the white margin automatically
\begin_inset Foot
status open

\begin_layout Plain Layout
\begin_inset Flex URL
status collapsed

\begin_layout Plain Layout

http://www.ctan.org/pkg/pdfcrop
\end_layout

\end_inset


\end_layout

\end_inset

.
 In 
\series bold
knitr
\series default
, we can set up the hook 
\emph on
hook_pdfcrop()
\emph default
 to work with a chunk option, say, 
\family typewriter
crop
\family default
.
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<crop-hook, cache=FALSE>>=
\end_layout

\begin_layout Plain Layout

knit_hooks$set(crop=hook_pdfcrop)
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Now we compare two plots below.
 The first one is not cropped (Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:pdf-nocrop"

\end_inset

); then the same plot is produced but with a chunk option 
\family typewriter
crop=TRUE
\family default
 which will call the cropping hook (Figure 
\begin_inset CommandInset ref
LatexCommand ref
reference "fig:pdf-crop"

\end_inset

).
\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout


\backslash
begin{kframe}
\end_layout

\begin_layout Plain Layout

<<pdf-nocrop, fig.width=3.2, fig.height=3.2, out.width='.5
\backslash

\backslash
linewidth'>>=
\end_layout

\begin_layout Plain Layout

par(mar=c(5,4,4,2),bg='white')  # large margin
\end_layout

\begin_layout Plain Layout

plot(lat~long,data=quakes,pch=20,col=rgb(0,0,0,.2))
\end_layout

\begin_layout Plain Layout

@
\end_layout

\begin_layout Plain Layout


\backslash
end{kframe}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
The original plot produced in R, with a large margin.
\begin_inset CommandInset label
LatexCommand label
name "fig:pdf-nocrop"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
\begin_inset Float figure
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset ERT
status open

\begin_layout Plain Layout


\backslash
begin{kframe}
\end_layout

\begin_layout Plain Layout

<<pdf-crop, ref.label='pdf-nocrop', echo=FALSE, fig.width=3.2, fig.height=3.2,
 out.width='.5
\backslash

\backslash
linewidth', crop=TRUE>>=
\end_layout

\begin_layout Plain Layout

@
\end_layout

\begin_layout Plain Layout


\backslash
end{kframe}
\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
The cropped plot; it fits better in the document.
\begin_inset CommandInset label
LatexCommand label
name "fig:pdf-crop"

\end_inset


\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
As we can see, the white margins are gone.
 If we use 
\emph on
par()
\emph default
, it might be hard and tedious to figure out a reasonable amount of margin
 in order that neither is any label cropped nor do we get a too large margin.
 My experience is that 
\family typewriter
pdfcrop
\family default
 works well with base graphics, but barely works with 
\series bold
grid
\series default
 graphics (therefore 
\series bold
lattice
\series default
 and 
\series bold
ggplot2
\series default
 are ruled out).
\end_layout

\begin_layout Subsection
Manually Saved Plots
\end_layout

\begin_layout Standard
We have explained how R plots are recorded before.
 In some cases, it is not possible to capture plots by 
\emph on
recordPlot()
\emph default
 (such as 
\series bold
rgl
\series default
 plots), but we can save them using other functions.
 To insert these plots into the output, we need to set up a hook first like
 this (see 
\family typewriter
?hook_plot_custom
\family default
 for details):
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<custom-plot-hook, cache=FALSE>>=
\end_layout

\begin_layout Plain Layout

knit_hooks$set(custom.plot = hook_plot_custom)
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Standard
Then we set the chunk option 
\family typewriter
custom.plot=TRUE
\family default
, and manually write plot files in the chunk.
 Here we show an example of capturing GGobi plots using the function 
\emph on
ggobi_display_save_picture()
\emph default
 in the 
\series bold
rggobi
\series default
 package:
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<ggobi-plot, custom.plot=TRUE, fig.ext='png', out.width='2.5in', results='hide',
 warning=FALSE>>=
\end_layout

\begin_layout Plain Layout

library(rggobi)
\end_layout

\begin_layout Plain Layout

ggobi(ggobi_find_file('data', 'flea.csv'))
\end_layout

\begin_layout Plain Layout

Sys.sleep(1)  # wait for snapshot
\end_layout

\begin_layout Plain Layout

ggobi_display_save_picture(path=fig_path('.png'))
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Standard
One thing to note here is we have to make sure the plot filename is from
 
\emph on
fig_path()
\emph default
, which is a convenience function to return the figure path for the current
 chunk.
\end_layout

\begin_layout Standard
We can do whatever normal R plots can do with this hook, and we give another
 example below to show how to work with animations.
\end_layout

\begin_layout Standard
\begin_inset ERT
status open

\begin_layout Plain Layout

<<rgl-animation, custom.plot=TRUE, fig.ext='png', out.width='2.5in', fig.show='animat
e', fig.num=20, interval=.4,  aniopts='controls,autoplay', results='hide',
 warning=FALSE>>=
\end_layout

\begin_layout Plain Layout

library(animation) # adapted from demo('rgl_animation')
\end_layout

\begin_layout Plain Layout

data(pollen)
\end_layout

\begin_layout Plain Layout

uM = matrix(c(-0.37, -0.51, -0.77, 0, -0.73, 0.67, -0.1, 0, 0.57, 0.53, -0.63, 0,
 0, 0, 0, 1), 4, 4)
\end_layout

\begin_layout Plain Layout

library(rgl)
\end_layout

\begin_layout Plain Layout

open3d(userMatrix = uM, windowRect = c(0, 0, 400, 400))
\end_layout

\begin_layout Plain Layout

plot3d(pollen[, 1:3])
\end_layout

\begin_layout Plain Layout

zm = seq(1, 0.05, length = 20)
\end_layout

\begin_layout Plain Layout

par3d(zoom = 1)  # change the zoom factor gradually later
\end_layout

\begin_layout Plain Layout

for (i in 1:length(zm)) {
\end_layout

\begin_layout Plain Layout

    par3d(zoom = zm[i]); Sys.sleep(.05)
\end_layout

\begin_layout Plain Layout

    rgl.snapshot(fig_path('png', number = i))
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\begin_layout Subsection
rgl Plots
\end_layout

\begin_layout Standard
With the hook 
\emph on
hook_rgl()
\emph default
, we can easily save snapshots from the 
\series bold
rgl
\series default
 package.
 We have shown an example in the main manual, and here we add some details.
 The rgl hook is a good example of taking care of details by carefully using
 the 
\family typewriter
options
\family default
 argument in the hook; for example, we cannot directly set the width and
 height of rgl plots in 
\emph on
rgl.snapshot()
\emph default
 or 
\emph on
rgl.postscript()
\emph default
, so we make use of the options 
\family typewriter
fig.width
\family default
, 
\family typewriter
fig.height
\family default
 and 
\family typewriter
dpi
\family default
 to calculate the expected size of the window, then resize the current window
 by 
\emph on
par3d()
\emph default
, and finally save the plot.
\end_layout

\begin_layout Standard
This hook is actually built upon 
\emph on
hook_plot_custom()
\emph default
 -- first it saves the 
\series bold
rgl
\series default
 snapshot, then it calls 
\emph on
hook_plot_custom()
\emph default
 to write the output code.
\end_layout

\begin_layout Section
\start_of_appendix
How to Compile This Manual
\end_layout

\begin_layout Standard
This manual has a long chain of dependencies, so it may not be easy to compile.
 These packages are required (all of them are free software):
\end_layout

\begin_layout Description
R Cairo, ggplot2, tikzDevice, rgl, rggobi, animation (all available on CRAN
 except tikzDevice which is on R-Forge for the time being)
\end_layout

\begin_layout Description
LaTeX animate, hyperref and the tufte-handout class
\end_layout

\begin_layout Description
Other GGobi, pdfcrop
\end_layout

\end_body
\end_document
