#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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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 <>= \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