Sweave com gráficos do R em tikz

June 3, 2011
By

This post was kindly contributed by Ridículas - go there to comment and to read the full post.

Gráfico feito pelo R mas com tradução para código tikz. A fonte usada é a nativa do LaTeX.

O Sweave é a ferramenta que permite a edição textos em LaTeX, de alta qualidade diagramática, com a inclusão de códigos R. Isso facilita muito a vida de quem precisa gerar relatórios de análises, material didático sobre estatística, dissertação e teses com temas afins.

Tikz (e PGF) é um pacote LaTeX desenvolvido pelo Professor Till Tantau para fazer gráficos a partir de códigos. Os códigos são interpretados e no documento gerado são inseridas as figuras. A vantagem de fazer figuras usando os recursos do tikz é que elas ficam altamente compatíveis com aspectos do texto, por exemplo, a fonte (tipo, tamanho) dos gráficos é a mesma do texto. Além disso, o seu arquivo *.tex é auto suficiente, pois as figuras são geradas a partir dele, não precisam estar no seu diretório ocupando espaço, ou que aumenta a portabilidade. Para instalar esse pacote do LaTeX, abra uma janela de terminal Linux e digite

sudo apt-cache search pgf # lista a busca com esse termo
sudo apt-get install pgf  # faz a instalação do pacote

O pacote tikzDevice do R, desenvolvido por Charlie Sharpsteen e Cameron Bracken, faz conversão de um gráfico do R em código tikz. Dessa forma, podemos importar o arquivo gerado e ter os gráficos do R dentro um documento feito em LaTex com as definições de texto e expressões matemáticas (com letras gregas, integrais, somatórios, frações, etc). Para instalar esse pacote, abra uma sessão R e digite

install.packages("tikzDevice", dep=TRUE)

Se você já usa sweave não vai ter dificuldades de usar os dois procedimentos que vou apresentar. O primeiro deles no chunk eu faço o gráfico, exporto com a função tikz() e a figura é gerada somente na compilação tex -> pdf. No segundo, no chunk eu exporto com a função tikz() mas num arquivo *.tex sozinho, que é compilado separado, ou seja, a figura é gerada pelo próprio R no momento da compilação Rnw -> tex. Um código mínimo para o primeiro procedimento está abaixo.

\documentclass{article}

\usepackage{Sweave}
\usepackage{tikz}

\SweaveOpts{keep.source=true}

\title{Usando ti\textit{k}z no Sweave}
\author{Walmes Zeviani\\ LEG/UFPR}
\date{3 de Junho de 2011}

\begin{document}

\maketitle

C\'{o}digo m\'{i}nimo reproduz\'{i}vel usando \texttt{tikzDevice}
para exportar gr\'{a}ficos feitos no R para codifica\c{c}\~{a}o ti\textit{k}z.

{\footnotesize
<<>>=
#------------------------------------------------------------------------------------------

require(tikzDevice)
set.seed(2011); x <- rnorm(200)
tikz("plot.tex", w=5, h=3)
hist(x, freq=FALSE, ylab="Densidade",
main="Histograma de uma amostra de $X \\sim N(\\mu=0, \\sigma^2=1)$")
curve(dnorm(x), col=2, add=TRUE, lwd=2); rug(x)
legend("topleft", col=2, lty=1, lwd=2, bty="n",
legend="$\\displaystyle \\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\cdot e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}$")
box(); dev.off()

#------------------------------------------------------------------------------------------
@
}

\input{plot.tex}

\end{document}

Para compilar esse arquivo Rnw -> tex, tex -> pdf, abra uma sessão do terminal Linux no diretório do arquivo e digite

R CMD Sweave arquivo.Rnw
pdflatex arquivo.tex

Pronto! Com isso seu arquivo pdf foi gerado (veja o meu arquivo). O procedimento abaixo corresponde ao segundo que mencionei.

\documentclass{article}

\usepackage{Sweave}
\usepackage{tikz}

\SweaveOpts{keep.source=true}

\title{Usando ti\textit{k}z no Sweave}
\author{Walmes Zeviani\\ LEG/UFPR}
\date{3 de Junho de 2011}

\begin{document}

\maketitle

C\'{o}digo m\'{i}nimo reproduz\'{i}vel usando \texttt{tikzDevice}
para exportar gr\'{a}ficos feitos no R para codifica\c{c}\~{a}o ti\textit{k}z.

{\footnotesize
<<>>=
#------------------------------------------------------------------------------------------

require(tikzDevice)

set.seed(2011); x <- rnorm(200)
tikz("plot2.tex", w=5, h=3, standAlone=TRUE,
packages=c("\\usepackage{tikz}",
"\\usepackage[active,tightpage,psfixbb]{preview}",
"\\PreviewEnvironment{pgfpicture}",
"\\setlength\\PreviewBorder{0pt}"))
hist(x, freq=FALSE, ylab="Densidade",
main="Histograma de uma amostra de $X \\sim N(\\mu=0, \\sigma^2=1)$")
curve(dnorm(x), col=2, add=TRUE, lwd=2); rug(x)
legend("topleft", col=2, lty=1, lwd=2, bty="n",
legend="$\\displaystyle \\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\cdot e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}$")
box(); dev.off()

tools::texi2dvi("plot2.tex", pdf=TRUE)

#------------------------------------------------------------------------------------------
@
}

\includegraphics{plot2.pdf}

\end{document}

A diferença é que o segundo procedimento cria figuras no seu diretório. Dependendo da tarefa, você pode usar o Sweave de uma forma ou de outra, até mesmo combinando entre elas. Até a próxima ridícula.


Tags: , , ,

Comments are closed.