Crie imagens a partir de dados estatísticos automaticamente

Crie imagens a partir de dados estatísticos automaticamente

Estou procurando uma maneira de criar automaticamente imagens como a abaixo:

Gráfico de Bart

Não existe MWE porque tudo que tenho, por enquanto, é esta imagem (criada, acredito, pelo SPSS, mas não tenho nada a ver com essa parte). Eu poderia simplesmente adicionar esta imagem ao meu documento, é claro, mas já que esses problemas surgem com alguma frequência. Eu gostaria de tentar uma maneira "nativa" do LaTeX, por assim dizer. Tenho certeza de que algum pacote gráfico está mais do que à altura da tarefa, mas nem sei por onde começar a procurar.

Não espero que você faça o trabalho para mim, então tudo o que estou pedindo, na verdade, é uma indicação na direção certa, um FAQ, um COMO FAZER, talvez um exemplo.

Responder1

Esta não é uma resposta completa, apenas um ponteiro que pressupõe que não é necessário nenhum tratamento automatizado dos dados.

EDIT: conforme recomendado por Jake, usar \addplot tableem vez de \addplot plot coordinatesevita muitos problemas.

insira a descrição da imagem aqui

\documentclass{book}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\definecolor{mybarcolor}{RGB}{210 207 155}
\pgfmathsetmacro{\xmin}{-.5}
\begin{axis}[ymin=0,%
    xmin=\xmin,%
    xtick={0,2,4,6},%
    xticklabels={.00,2.00,4.00,6.00},%
    axis background/.style={fill=black!10},%
    ylabel=\textbf{H\"{a}ufigkeit},%
    xlabel=$D_\mathrm{rel}$,%
]
\addplot[ybar interval,fill=mybarcolor] table {%
0   7
.5  38
1   23
1.5 8
2   8
2.5 8
3   2
3.5 1
4   2
4.5 0
5   0
5.5 1
6   1
};
\addplot[domain=\xmin:6,samples=100] {18*exp(-.5*(x-1.5)^2)};
\end{axis}
\end{tikzpicture}
\end{document}

Responder2

Aqui está um exemplo ligeiramente modificado do manual Asymptote. Ele não apenas cria automaticamente uma imagem a partir de dados estatísticos, mas também demonstra como gerar os dados. Processe o seguinte hist.asyarquivo com asy -f pdf hist.asy.

import graph;
import stats;
size(400,200,IgnoreAspect);

real lineWidth=2pt;
pen histFillPen=rgb(217/255, 206/255, 143/255)+opacity(0.7);
pen histLinePen=black;
pen linePen=red+lineWidth; 
pen bgPen=rgb(241/255, 240/255, 238/255); 

int n=10000;
real[] a=new real[n];
for(int i=0; i < n; ++i) a[i]=Gaussrand();

path g=graph(Gaussian,min(a),max(a));

pair gMin=min(g);
pair gMax=max(g)+(0,0.05);

filldraw(box(gMin,gMax),bgPen,black);

draw(g,linePen);

// Optionally calculate "optimal" number of bins a la Shimazaki and Shinomoto.
int N=bins(a);
histogram(a,min(a),max(a),N,normalize=true,low=0,fillpen=histFillPen,drawpen=histLinePen,bars=true);

xaxis("$x$",BottomTop,RightTicks);
yaxis("$dP/dx$",LeftRight,RightTicks(trailingzero));

insira a descrição da imagem aqui

Responder3

Se você estiver disposto a usar outra ferramenta para criar o gráfico como PDF e incluí-lo em seu TeX, definitivamente sugerirei o gnuplot. É bastante poderoso e você pode representar virtualmente tudo o que desejar com ele. Para a criação automatizada do gráfico, você precisará incluir o comando gnuplot em seu Makefile ou sequência LaTeX. Você também pode parametrizar o arquivo de dados se desejar gerar vários gráficos semelhantes a partir de vários arquivos de dados.

Responder4

MWE

Acho que criar um documento LateX com imagens (e resultados de texto) gerados automaticamente a partir de dados estatísticos é um trabalho paraRcomTeceroutricô.

Resumindo, você pode criar um documento LateX normal que tenha a extensão .Rnw em vez de .tex(arquivo noweb) com "pedaços" de código R inseridos. Em seguida, o Sweave in R exporta isso como um .texarquivo verdadeiro, onde os pedaços R são alterados pelo código LateX com os resultados (imagens, tabelas ou texto) gerados por esses pedaços R. Então você pode compilar o .texarquivo pdflatexnormalmente.

Por exemplo, um test.Rnwarquivo mínimo com um pedaço R mínimo poderia ser:

\documentclass{article}
\begin{document}
<<>>=
2+3
@
\end{document}

O arquivo acima com .texextensão e compilado pdflatex será produzido de forma simples:

<<>>= 2+3@

Mas convertido com R CMD Sweave test.Rnwvocê obterá isto test.tex:

\documentclass{article}
\usepackage{Sweave}
\begin{document}
\begin{Schunk}
\begin{Sinput}
> 2+3
\end{Sinput}
\begin{Soutput}
[1] 5
\end{Soutput}
\end{Schunk}

Isso compilado (com pdflatex test.tex) produzirá:

> 2+3

[1] 5

Bem, não é muito impressionante, apenas mostre uma soma simples como vista em um console R. Mas R é um programa estatístico fantástico, e o resultado de um pedaço de R pode ser um \includegraphics{}gráfico bonito ou uma tabela LaTeX completa ( \begin{table} ...), com ou sem mostrar a entrada. Mesmo resultados que são números simples podem ser inseridos no texto com \Sexpr(exemplo: \Sexpr{2+3}}. Assim, por exemplo, para gerar relatórios estatísticos periódicos em LaTeX, apenas modificando os dados originais gerenciados por R (um .csvarquivo simples, por exemplo) com dois comandos ou simples script você pode obter gráficos atualizados automaticamente, mas também tabelas atualizadas e resultados atualizados em texto simples, sem editar o código LaTeX todas as vezes e sem abrir R. Isso é impressionante o suficiente agora?

A captura de tela acima foi gerada com este hist.Rnwarquivo mais elaborado:

% File: hist.Rnw
%
% Usage:  
%
% R CMD Sweave hist.Rnw 
% pdflatex hist.tex

\documentclass{article}
\usepackage[utf8]{inputenc} 
\usepackage{lipsum} 
\begin{document}

\lipsum[1] % dummy text

\begin{figure}[h]   
\centering

% R Chunk 
<<Histogran,echo=F,fig=T>>=

# Some random data
foo <- rnorm(1000, mean=1, sd=1)

# The histogram 
hist(foo, prob=TRUE, border="tan4", ylab="Häufigkeit",
xlab="D_rel",col=rainbow(25,start=.4,end=.35), main="")

# To have also the ugly background area (optional): 
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], 
col =  "lightgrey") 

hist(foo, prob=TRUE, border="tan4", ylab="Häufigkeit",
xlab="D_rel",col=rainbow(40,start=.1,end=.4), main="",  add=T) 

# Density plot
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), 
lwd=2, col="darkred", add=T)

@ % end of R chunk

\caption{This is a histogram of foo population with
mean=\Sexpr{round(mean(foo),2)} and sd=\Sexpr{round(sd(foo),2)}. 
On the other hand,  significance of Shapiro-Wilk test of normality is
p=\Sexpr{signif(shapiro.test(foo)$p.value,2)}, so this is a normal
population as sure as 2+2=\Sexpr{2+2}, as everybody knows (except some 
processors with floating point bugs). }


\end{figure}

\lipsum[3] % more dummy text

\end{document}

informação relacionada