如何对 pgfplots 中的许多 \addplot 命令应用相同的坐标计算

如何对 pgfplots 中的许多 \addplot 命令应用相同的坐标计算

我有一大堆数据文件,其中包含测量程序的输出,它们都具有相同的多列结构,我想使用以相同的方式绘制它们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}

相关内容