pgfplots 中误差的自动计算

pgfplots 中误差的自动计算

当通过文件(例如table[x index=0, y index=1, y error index=2]{plots/mydata.table};)获取数据时,是否可以自动计算误差线(而不是手动输入)?误差计算是一种相当简单的方式,我认为像 pgfplots 这样完整的包会将其作为一项功能包含在内。

我对很多选择都持开放态度。显然,纯 LaTeX(即 pgfplots)解决方案是最好的。如果有一种方法可以在编译时自动运行脚本,并在使用数据文件之前对其进行更改,那么这也是可以的(这可能是最简单的方法,尽管我不知道如何实现自动化)。

平均能量损失

\documentclass{article}
\usepackage{pgfplots}
\usepackage{tikz}

\pgfplotsset{compat=1.7}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[grid=major]
    \addplot+[smooth,
    error bars/.cd,
    y dir=both,
    y explicit]
    table[x index=0, y index=1, y error index=2]
    {plots/mydata.table}; % simple space-delimited data file
  \end{axis}
\end{tikzpicture}
\end{document}

样本mydata.table

# Test input file
Sample Measure1 Measure2 Measure3 Measure4 ...
5 180 190 200 210
15 420 410 400 390
25 650 640 630 640
35 1100 1200 1150 1020

我有一个脚本可以生成

5 194.4 4.36898157469
10 195.6 1.4310835056
15 207.4 2.23785611691
20 250.4 1.4587666023

给定输入文件。

答案1

PGFPlots 附带 PGFPlotstable 包,可以处理制表数据。它不包含计算数据列的平均值、标准差或标准误差等汇总统计数据的函数,但可以很容易地添加这些函数。

在文档中包含必要的代码后,您可以告诉 PGFPlots,stderror通过在图表之前的某处放置以下几行,使第 2 列至第 5 列数据的标准误差在调用的列中可用:

\pgfplotstableset{
    summary statistics/end index=5,
    create on use/stderror/.style={create col/standard error}
}

默认情况下,代码假定数据列从索引 1(即表中的第二列)开始并从第 4 列结束,但可以使用键summary statistics/start index和进行更改summary statistics/end index

然后,你可以绘制每行的平均值,误差线代表第 2 列至第 5 列的标准误差,使用

  \begin{axis}[grid=major]
    \addplot+[
        smooth,
        error bars/.cd,
            y dir=both,
            y explicit
    ]
    table[
            x=Sample,
            y=mean,
            y error=stderror
    ]
    {data.txt};
  \end{axis}

下面是使用您提供的数据的一个示例(为了获得更显著的效果,对值进行了略微的改变):

\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepackage{filecontents}


\begin{filecontents*}{data.txt}
Sample Measure1 Measure2 Measure3 Measure4
5 80 190 200 210
15 520 410 430 350
25 650 640 630 900
35 1100 1200 1150 1020
\end{filecontents*}

\pgfplotsset{compat=1.7}


%% Code chunk for statistics starts here...
\newcommand{\calcrowmean}{
    \def\rowmean{0}
    \pgfmathparse{\pgfkeysvalueof{/pgfplots/table/summary statistics/end index}-\pgfkeysvalueof{/pgfplots/table/summary statistics/start index}+1}
    \edef\numberofcols{\pgfmathresult}
            % ... loop over all columns, summing up the elements
    \pgfplotsforeachungrouped \col in {\pgfkeysvalueof{/pgfplots/table/summary statistics/start index},...,\pgfkeysvalueof{/pgfplots/table/summary statistics/end index}}{
        \pgfmathparse{\rowmean+\thisrowno{\col}/\numberofcols}
        \edef\rowmean{\pgfmathresult}
    }
}
\newcommand{\calcstddev}{
    \def\rowstddev{0}
    \calcrowmean
    \pgfplotsforeachungrouped \col in {\pgfkeysvalueof{/pgfplots/table/summary statistics/start index},...,\pgfkeysvalueof{/pgfplots/table/summary statistics/end index}}{
        \pgfmathparse{\rowstddev+(\thisrowno{\col}-\rowmean)^2/(\numberofcols-1)}
        \edef\rowstddev{\pgfmathresult}
    }
    \pgfmathparse{sqrt(\rowstddev)}
}
\newcommand{\calcstderror}{
    \calcrowmean
    \calcstddev
    \pgfmathparse{sqrt(\rowstddev)/sqrt(\numberofcols)}
}

\pgfplotstableset{
    summary statistics/start index/.initial=1,
    summary statistics/end index/.initial=4,
    create col/mean/.style={
        /pgfplots/table/create col/assign/.code={% In each row ... 
            \calcrowmean
            \pgfkeyslet{/pgfplots/table/create col/next content}\rowmean
        }
    },
    create col/standard deviation/.style={
        /pgfplots/table/create col/assign/.code={% In each row ... 
            \calcstddev
            \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult
        }
    },
    create col/standard error/.style={
        create col/assign/.code={% In each row ... 
            \calcstderror
            \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult
        }
    }
}
%%...code chunk for statistics ends here

\begin{document}
\pgfplotstableset{
    create on use/mean/.style={create col/mean},
    create on use/stddev/.style={create col/standard deviation},
    create on use/stderror/.style={create col/standard error}
}
\pgfkeys{/pgf/fpu=true} % Only needed for \pgfplotstabletypeset
\pgfplotstabletypeset[columns={Sample, Measure1, Measure2, Measure3, Measure4, mean, stddev, stderror}]{data.txt}
\pgfkeys{/pgf/fpu=false}

\begin{tikzpicture}
  \begin{axis}[grid=major]
    \addplot+[
            smooth,
            error bars/.cd,
        y dir=both,
        y explicit
    ]
    table[
            x=Sample,
            y=mean,
            y error=stderror
    ]
    {data.txt};
  \end{axis}
\end{tikzpicture}
\end{document}

相关内容