当通过文件(例如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}