为什么 pgfplots 中的 groupplot 中的 foreach 失败?

为什么 pgfplots 中的 groupplot 中的 foreach 失败?

我知道如果\foreach在 pgfplots 的 axis 环境中使用该命令,会出现一些扩展问题。我已阅读关于这个问题的回答并且我知道循环变量应该通过 edef 进行扩展。但是使用这样的技巧后,我的代码仍然失败。

我打算借助 groupplots 库绘制一些子图。数据文件是 d1.dat、d2.dat 等等。所以我尝试使用 foreach 来绘制它们。以下是我的尝试。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\begin{filecontents*}{d1.dat}
1   2
2   3
\end{filecontents*}

\begin{filecontents*}{d2.dat}
1   3
1.5   0
2   4
\end{filecontents*}
\usepgfplotslibrary{groupplots}
\begin{document}

\begin{tikzpicture}
\begin{axis}
    \foreach \x in {1,2}{
        \edef\tmp{\noexpand\addplot table {d\x.dat};}
        \tmp
    }
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{groupplot}[
    group style={
        group size=1 by 2,
        vertical sep=2cm
    }]
    \nextgroupplot[title=data1]
    \addplot table {d1.dat};
    \nextgroupplot[title=data2]
    \addplot table {d2.dat};
\end{groupplot}
\end{tikzpicture}

% \begin{tikzpicture}
% \begin{groupplot}[
%     group style={
%         group size=1 by 2,
%         vertical sep=2cm
%     }
%     ]
%     \foreach \x/\y in {1/data1,2/data2}{
%     \edef\tmp{
%         \noexpand\nextgroupplot[title=\y]
%         \noexpand\addplot table {d\x.dat};
%     }
%     \tmp
%     }
% \end{groupplot}
% \end{tikzpicture}

\end{document}

上面的代码包含三个tikzpicture环境。在第一个tikzpicture环境中,edef使用了该技术并且它按预期工作。在最后一个tikzpicture环境中,我仍然使用此方法但失败了。我想知道它失败的原因。

答案1

\foreach关于这些细微差别,人们可以写一个单独的问题和答案。;-)

这里的问题是,\foreach它将迭代的内容分组。讽刺的是,尽管名字如此,但\groupplots 并不想被分组。所以\pgfplotsforeachungrouped在这里解决了这个问题。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\begin{filecontents*}{d1.dat}
1   2
2   3
\end{filecontents*}

\begin{filecontents*}{d2.dat}
1   3
1.5   0
2   4
\end{filecontents*}
\usepgfplotslibrary{groupplots}
\begin{document}

% this fails because the group plots are in group
% 
% \begin{tikzpicture}
% \begin{groupplot}[
%     group style={
%         group size=1 by 2,
%         vertical sep=2cm
%     }]
%     \begingroup\nextgroupplot[title=data1]
%     \addplot table {d1.dat};\endgroup
%     \begingroup\nextgroupplot[title=data2]
%     \addplot table {d2.dat};\endgroup
% \end{groupplot}
% \end{tikzpicture}

\begin{tikzpicture}
\begin{groupplot}[
    group style={
        group size=1 by 2,
        vertical sep=2cm
    }
    ]
    \pgfplotsforeachungrouped \x in {1,2}{
    \edef\tmp{
        \noexpand\nextgroupplot[title=data\x]
        \noexpand\addplot table {d\x.dat};
    }
    \tmp
    }
\end{groupplot}
\end{tikzpicture}

\end{document}

在此处输入图片描述

如果取消注释注释部分,则可以验证将\groupplots 放入组中会导致错误,无论\foreach

相关内容