使用 pgfplots 绘制测量平均值

使用 pgfplots 绘制测量平均值

我有一个测量文件,计划用 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)计算坐标”手动的了解更多信息。

链接到适用于 Windows 的 Gawk


编辑:

如果要将样本标准差添加到数据中,可以将 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}

在此处输入图片描述

相关内容