Arquivo

Posts Tagged ‘tikz’

Usando Sweave para fazer figuras com tikz integrado o GNUplot

Printscreen do documento pdf final.

Tikz é um pacote LaTeX para fazer figuras. As figuras são feitas por comandos assim como fazemos os gráficos no R. Porém, as opções da tikz vão além de gráficos de exploração gráfica ou de resultados como os do R. É possível fazer figuras bem complexas e de alta qualidade tipográfica com esse pacote. Veja os exemplos.

Para gráfico de funções paramétricas, o tikz passa o trabalho para o gnuplot fazer. É uma integração que permite combinar a poderosa ferramenta gráfica que é o gnuplot com a qualidade tipográfica do tikz.

Para melhorar ainda mais, podemos usar o Sweave para controlar os componentes do gráfico que o tikz vai passar para o gnuplot. É um que passa para o outro, que passa para o outro… trabalho em equipe! Aqui então surge uma pergunta: se é para usar Sweave, por que não fazer os gráficos com o R e incluí-los no documento? Primeiro, vamos aprender uma forma equivalente de fazer gráficos simples com o tikz-gnuplot, basicamente aqueles que fazemos com a função curve() do R. Segundo, com tikz-gnuplot a figura fica com o mesmo tipo de fonte do texto. (Ainda podemos exportar figuras usando o pacote tikzDevice, veja esse post).

O CMR desse post é um arquivo *.Rnw, típico de documento Sweave. Para que tudo funcione você terá que ter instalado o pgf/tikz e o gnuplot. Para instalá-los, abra um terminal linux e faça

$ sudo apt-get install pgf gnuplot

Para compilar Rnw -> tex, faça

$ R CMD Sweave foo.Rnw

Para compilar tex -> pdf, faça

$ pdflatex --shell-escape foo.tex

em que a opção --shell-escape é para permitir que o latex chame o gnuplot. Caso não coloque essa opção, nada que use o gnuplot aparecerá no documento compilado. Salve o conteúdo abaixo em um documento com extensão *.Rnw.

Nesse documento eu gero a mesma figura de duas formas: 1) empregando o gnuplot e 2) usando as capacidades gráficas do próprio tikz. Você não verá diferença entre os gráficos (a não ser a cor) porque eles são funções simples de plotar. Pórem, o tikz por sí só não tem tanta capacidade para fazer gráficos, e para funções mais complexas só mesmo a integração do gnuplot para conseguir os objetivos. Até a próxima ridícula.

\documentclass[a4paper,10pt]{article}
\usepackage{Sweave}
  \SweaveOpts{eps=FALSE, keep.source=TRUE}
\usepackage[utf8]{inputenc}
\usepackage[brazil]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz}
  \usetikzlibrary{arrows,shadows}

\begin{document}

Seja $X$ uma variável aleatória com distribuição Normal padrão, ou seja,
$X\sim \text{N}(\mu=0,\sigma=1)$. Calcule a $\Pr(\Sexpr{(xi <- -1.5)}<X<\Sexpr{(xs <- 0.75)})$
e faça o esboço da função densidade com destaque para área correspondente ao evento de interesse.

<<>>=
pr <- pnorm(xs)-pnorm(xi)
pr
@

\begin{center}
% esse gráfico é feito pelo gnuplot
\begin{tikzpicture}[domain=-3.5:3.5, yscale=4, xscale=0.5]
  \draw[very thin, color=gray, xstep=1cm, ystep=0.05cm] (-4.2,-0.02) grid (4.2,0.42);
  \begin{scope}[smooth, draw=black, y=0.3989422804cm]
    \filldraw [fill=gray!90]
      plot[id=f1,domain=\Sexpr{xi}:\Sexpr{xs}] function {exp(-x*x/2)}
      -- (\Sexpr{xs},0) node[below] {$\Sexpr{round(xs,2)}$}
      -- (\Sexpr{xi},0) node[below] {$\Sexpr{round(xi,2)}$} -- cycle;
    \draw[black] plot[id=f7, domain=-3.5:3.5, samples=100]
    function {exp(-x*x/2)};
    \draw[->] (-4.2,0) -- (4.2,0) node[below right] {};            
    \draw (0,0) -- (0,1) node[above] {};
  \end{scope}
\end{tikzpicture}
% esse gráfico é feito pelo tikz, sem gnuplot
\begin{tikzpicture}[domain=-3.5:3.5, yscale=4, xscale=0.5]
  \draw[very thin, color=gray, xstep=1cm, ystep=0.05cm] (-4.2,-0.02) grid (4.2,0.42);
  \draw[color=red] plot (\x,{0.4*exp(-0.5*\x*\x)});
  \filldraw[fill=red] plot[domain=\Sexpr{xi}:\Sexpr{xs}] (\x,{0.4*exp(-0.5*\x*\x)})
    -- (\Sexpr{xs},0) node[below] {$\Sexpr{round(xs,2)}$}
    -- (\Sexpr{xi},0) node[below] {$\Sexpr{round(xi,2)}$} -- cycle;
  \draw[->] (-4.2,0) -- (4.2,0);
  \draw (0,0) -- (0,0.4);
\end{tikzpicture}
\end{center}

\end{document}
Categorias:sweave, tikz Tags:, ,

Sweave com gráficos do R em tikz

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.

Categorias:gráficos, sweave, tikz Tags:, ,