![根据统计数据自动创建图像](https://linux22.com/image/265917/%E6%A0%B9%E6%8D%AE%E7%BB%9F%E8%AE%A1%E6%95%B0%E6%8D%AE%E8%87%AA%E5%8A%A8%E5%88%9B%E5%BB%BA%E5%9B%BE%E5%83%8F.png)
我正在寻找一种自动创建如下所示图像的方法:
没有 MWE,因为我现在只有这张图片(我相信是由 SPSS 创建的,但我与这部分无关。)当然,我可以简单地将这张图片添加到我的文档中,但由于这些问题出现的频率很高,我想尝试一种“原生”LaTeX 方式。我很确定某些图形软件包足以胜任这项任务,但我甚至不知道从哪里开始寻找。
我不指望你为我做这些工作,所以我真正要求的只是一个正确方向的指引、一份常见问题解答、一份操作指南,或许是一个样本。
答案1
这不是一个完整的答案,只是一个假设不需要自动处理数据的指针。
编辑:正如杰克所建议的,使用\addplot table
而不是\addplot plot coordinates
可以省去很多麻烦。
\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}
答案2
这是来自 Asymptote 手册的一个稍作修改的示例。它不仅可以自动从统计数据创建图像,而且还演示了如何首先生成数据。使用 处理以下hist.asy
文件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));
答案3
如果您愿意使用其他工具将绘图创建为 PDF 并将其包含在 TeX 中,我绝对会推荐 gnuplot。它非常强大,您几乎可以用它绘制任何您想要的图形。要自动创建绘图,您需要在 LaTeX Makefile 或序列中包含 gnuplot 命令。如果您想从多个数据文件生成多个类似的绘图,您也可以参数化数据文件。
答案4
我认为创建一个 LateX 文档,其中包含从统计数据自动生成的图像(和文本结果)R和斯维夫或者针织品。
简而言之,您可以制作一个普通的 LateX 文档,其扩展名为.Rnw
而不是.tex
(noweb 文件),并插入 R 代码的“块”。然后 R 中的 Sweave 将其导出为真实.tex
文件,其中的 R 块由 LateX 代码更改,并使用这些 R 块生成的结果(图像、表格或文本)。然后您可以像往常一样编译该.tex
文件pdflatex
。
例如,test.Rnw
具有最小 R 块的最小文件可能是:
\documentclass{article}
\begin{document}
<<>>=
2+3
@
\end{document}
上述文件带有.tex
扩展名并用其编译pdflatex
将简单地生成:
<<>>= 2+3 @
但转换后R CMD Sweave test.Rnw
你会得到这个test.tex
:
\documentclass{article}
\usepackage{Sweave}
\begin{document}
\begin{Schunk}
\begin{Sinput}
> 2+3
\end{Sinput}
\begin{Soutput}
[1] 5
\end{Soutput}
\end{Schunk}
编译(使用pdflatex test.tex
)将产生:
> 2+3
[1] 5
嗯,不是很令人印象深刻,只是显示一个简单的总和,就像在 R 控制台中看到的那样。但 R 是一个很棒的统计程序,R 块的结果可以是带有\includegraphics{}
漂亮图表的浮点数,也可以是完整的 LaTeX 表浮点数(\begin{table} ...
),可以显示或不显示输入。即使是简单的数字结果也可以插入到文本中\Sexpr
(例如:\Sexpr{2+3}
}。因此,例如要生成定期的统计 LaTeX 报告,只需使用两个.csv
命令或简单脚本修改由 R 管理的原始数据(例如,一个简单的文件),您就可以获得自动更新的图表,还可以获得更新的表格和纯文本中的更新结果。无需每次都编辑 LaTeX 代码。也不需要打开 R。这已经足够令人印象深刻了吗?
上面的屏幕截图是使用这个更复杂的hist.Rnw
文件生成的:
% 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}