
Estou procurando uma maneira de criar automaticamente imagens como a abaixo:
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 table
em vez de \addplot plot coordinates
evita muitos problemas.
\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.asy
arquivo 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));
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
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 .tex
arquivo 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 .tex
arquivo pdflatex
normalmente.
Por exemplo, um test.Rnw
arquivo mínimo com um pedaço R mínimo poderia ser:
\documentclass{article}
\begin{document}
<<>>=
2+3
@
\end{document}
O arquivo acima com .tex
extensão e compilado pdflatex
será produzido de forma simples:
<<>>= 2+3@
Mas convertido com R CMD Sweave test.Rnw
você 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 .csv
arquivo 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.Rnw
arquivo 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}