我知道如果\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
它将迭代的内容分组。讽刺的是,尽管名字如此,但\groupplot
s 并不想被分组。所以\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}
如果取消注释注释部分,则可以验证将\groupplot
s 放入组中会导致错误,无论\foreach
。