Usando Sweave para fazer figuras com tikz integrado o GNUplot

October 24, 2011
By

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

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}

Tags: , ,

Comments are closed.