
Estoy buscando una manera de crear automáticamente imágenes como la siguiente:
No hay MWE porque todo lo que tengo, por ahora, es esta imagen (creada, creo, por SPSS, pero no tengo nada que ver con esa parte). Podría simplemente agregar esta imagen a mi documento, por supuesto, pero como Estos problemas surgen con cierta frecuencia. Me gustaría probar una forma LaTeX "nativa", por así decirlo. Estoy bastante seguro de que algún paquete de gráficos está a la altura de la tarea, pero ni siquiera sé por dónde empezar a buscar.
No espero que usted haga el trabajo por mí, así que todo lo que pido, en realidad, es una indicación en la dirección correcta, una pregunta frecuente, un CÓMO, tal vez una muestra.
Respuesta1
Esta no es una respuesta completa, solo un indicador que supone que no se requiere ningún manejo automatizado de los datos.
EDITAR: según lo recomendado por Jake, usarlo \addplot table
en lugar de \addplot plot coordinates
ahorra muchas molestias.
\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}
Respuesta2
Aquí hay un ejemplo ligeramente modificado del manual de Asíntota. No sólo crea una imagen a partir de datos estadísticos automáticamente, sino que también demuestra cómo generar los datos en primer lugar. Procese el siguiente hist.asy
archivo con 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));
Respuesta3
Si está dispuesto a utilizar otra herramienta para crear el diagrama en formato PDF e incluirlo en su TeX, definitivamente le sugeriré gnuplot. Es bastante potente y prácticamente puedes graficar cualquier cosa que desees con él. Para la creación automatizada del gráfico, deberá incluir el comando gnuplot en su secuencia o archivo Makefile de LaTeX. También puede parametrizar el archivo de datos si desea generar múltiples gráficos similares a partir de múltiples archivos de datos.
Respuesta4
Creo que crear un documento LateX con imágenes (y resultados de texto) generados automáticamente a partir de datos estadísticos es un trabajo paraRcontejerotejer.
En resumen, puede crear un documento LateX normal que tenga la extensión .Rnw
en lugar de .tex
(archivo no web) con "fragmentos" insertados de código R. Luego, Sweave in R exporta esto como un .tex
archivo verdadero, donde los fragmentos de R se modifican mediante código LateX con los resultados (imágenes, tablas o texto) generados por estos fragmentos de R. Luego puede compilar el .tex
archivo pdflatex
como de costumbre.
Por ejemplo, un test.Rnw
archivo mínimo con un fragmento R mínimo podría ser:
\documentclass{article}
\begin{document}
<<>>=
2+3
@
\end{document}
El archivo anterior con una .tex
extensión y compilado pdflatex
se producirá simplemente:
<<>>= 2+3 @
Pero convertido con R CMD Sweave test.Rnw
usted obtendrá esto test.tex
:
\documentclass{article}
\usepackage{Sweave}
\begin{document}
\begin{Schunk}
\begin{Sinput}
> 2+3
\end{Sinput}
\begin{Soutput}
[1] 5
\end{Soutput}
\end{Schunk}
Eso compilado (con pdflatex test.tex
) producirá:
> 2+3
[15
Bueno, no es muy impresionante, solo muestra una suma simple como se ve en una consola R. Pero R es un programa estadístico fantástico, y el resultado de un fragmento de R podría ser un \includegraphics{}
gráfico bonito o una tabla flotante LaTeX completa ( \begin{table} ...
), con o sin mostrar la entrada. Incluso los resultados que son números simples se pueden insertar en el texto con \Sexpr
(ejemplo: \Sexpr{2+3}
}. Así, por ejemplo, para generar informes estadísticos periódicos LaTeX, modificando únicamente los datos originales manejados por R (un .csv
archivo simple, por ejemplo) con dos comandos o simples script puede obtener gráficos actualizados automáticamente, pero también tablas actualizadas y resultados actualizados en texto plano sin editar el código LaTeX cada vez y sin abrir R. ¿Eso ya es bastante impresionante?
La captura de pantalla anterior se generó con este hist.Rnw
archivo más 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}