我有一大堆数据文件,其中包含测量程序的输出,它们都具有相同的多列结构,我想使用以相同的方式绘制它们pgfplots
。有些图不仅绘制文件中包含的数据,还绘制从其中几列计算出的值。我可以通过为命令提供addplot
一个带有数学表达式的选项y expr = ...
来实现这一点,如下面的 MWE 所示:
\begin{filecontents}{plot1.dat}
x alpha beta
1 0.5 3
2 0.3 19
3 0.7 4
\end{filecontents}
\begin{filecontents}{plot2.dat}
x alpha beta
1 2 1
2 4 3
3 1 18
\end{filecontents}
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot+ table[x=x, y expr=\thisrow{alpha}-\thisrow{beta}]{plot1.dat};
\addplot+ table[x=x, y expr=\thisrow{alpha}-\thisrow{beta}]{plot2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
\addplot
但是,如果对超过 10 个文件的图表执行此操作,而只是简单地复制命令并交换每个文件的文件名,则非常烦人且容易出错。
我想出了一个更优雅的解决方案(感谢在 pgfplot 中使用 \addplot+ 和 \foreach)用来\foreach
迭代文件名:
\begin{filecontents}{plot1.dat}
x alpha beta
1 0.5 3
2 0.3 19
3 0.7 4
\end{filecontents}
\begin{filecontents}{plot2.dat}
x alpha beta
1 2 1
2 4 3
3 1 18
\end{filecontents}
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\foreach \file in {1,2}
\addplot table[x=x, y expr=\thisrow{alpha}-\thisrow{beta}]{plot\file.dat};
\end{axis}
\end{tikzpicture}
\end{document}
这降低了一点复杂性,因为我只需要为y expr =
每个图编写一次,但是对于几个单独的图,我仍然必须将表达式从一个复制到另一个。因此,我的问题是,我是否可以以某种方式定义一个“函数”,我可以将其写入选项中\begin{axis}
或\addplot+
将其用作坐标计算?
答案1
您可以为每个文件分别定义您的功能:
\tikzset{%
declare function={Function1(\x,\y)=(\x-\y);},
declare function={Function2(\x,\y)=(\x+\y);},
declare function={Function3(\x,\y)=(\x*\x-\x*\y);},
}
然后根据文件名调用该函数:
\addplot table[x=x, y expr={Function\file(\thisrow{alpha},\thisrow{beta})}]{plot\file.dat};
代码:
\begin{filecontents}{plot1.dat}
x alpha beta
1 0.5 3
2 0.3 19
3 0.7 4
\end{filecontents}
\begin{filecontents}{plot2.dat}
x alpha beta
1 2 1
2 4 3
3 1 18
\end{filecontents}
\begin{filecontents}{plot3.dat}
x alpha beta
1 0.5 3
2 0.3 19
3 0.7 4
\end{filecontents}
\documentclass{standalone}
\usepackage{pgfplots}
\tikzset{%
declare function={Function1(\x,\y)=(\x-\y);},
declare function={Function2(\x,\y)=(\x+\y);},
declare function={Function3(\x,\y)=(\x*\x-\x*\y);},
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\foreach \file in {1,2,3}
\addplot table[x=x, y expr={Function\file(\thisrow{alpha},\thisrow{beta})}]{plot\file.dat};
\end{axis}
\end{tikzpicture}
\end{document}