我有一个测量文件,计划用 pgfplots 绘制。每个输入都有多个测量值:
Size Time
100 599.3
100 598.0
100 597.7
100 597.9
100 596.3
100 592.6
100 593.1
100 600.3
250 21423.3
250 21479.8
250 21353.4
250 21333.7
250 21322.7
250 21262.6
250 21395.5
250 21873.0
250 21400.9
ETC。
当我尝试天真地绘制它们时,每次测量我都会得到一个点,这使得情节看起来很糟糕。
问题是:如何绘制每个输入大小的平均值?
答案1
您可以使用外部 shell 命令。
首先:我使用 Linux 和 gawk,我不确定在 Windows 上运行它有多容易。但原则上,您可以通过这种方式使用任何其他外部程序(例如,python 或 C 代码)。使用 plot shell 命令如下:
\begin{tikzpicture}
\begin{axis}
\addplot shell {awk '/^[0-9]/
{if($1!=x&&length(x)!=0){print x, y/n;x=$1;y=$2;n=1}
else{x=$1;y+=$2;n+=1;}}
END{print x,y/n}' file.dat};
\end{axis}
\end{tikzpicture}
编译时需要确保添加以下-shell-escape
选项:
pdflatex -shell-escape file.tex
参考:
请参阅第 4.3.6 节 - “使用外部程序(shell)计算坐标”手动的了解更多信息。
编辑:
如果要将样本标准差添加到数据中,可以将 shell 命令与表一起使用,这样很简洁:
\begin{tikzpicture}
\begin{axis}
addplot+[error bars/.cd, y dir=both,y explicit] table[x index=0, y index=1, y error index=2] shell
{awk '/^[0-9]/{if($1!=x&&length(x)!=0){print x, y/n, sqrt((n*sy-y*y)/n/(n-1));x=$1;y=$2;sy=$2*$2;n=1}
else{x=$1;y+=$2;sy+=$2*$2;n+=1;}}
END{print x,y/n, sqrt((n*sy-y*y)/n/(n-1))}' tmp.dat};
\end{axis}
\end{tikzpicture}