我想用 groupplots 创建一个图网格,其中每个图都取自外部文件并通过 pgfplots 包含。
由于事实上,这foreach
在环境中不能很好地工作axis
,所以我改用了pgfplotsforeachungrouped
。为了解决宏在最后扩展的问题,我将我的定义放在了\edef\temp{\noexpand...}; \temp
构造中。
我的问题是,在我的嵌套循环中,只有第一次迭代按预期执行。嵌套循环的限制也禁止使用,\pgfplotsinvokeforeach
因为此宏尚不支持嵌套循环。
x
我的网格由变量和定义y
。它应该遵循左侧的以下方案,但结果是标题采用中间方案,情节采用右侧方案。
expected: actual result (title): actual result (plot):
(1,1) (2,1) (3,1) (1,1) (2,1) (3,1) (1,1) (1,1) (1,1)
(1,2) (2,2) (3,2) (1,2) (2,1) (3,1) (1,1) (1,1) (1,1)
(1,3) (2,3) (3,3) (1,3) (2,1) (3,1) (1,1) (1,1) (1,1)
(1,4) (2,4) (3,4) (1,4) (2,1) (3,1) (1,1) (1,1) (1,1)
我怎样才能自动获取这个网格?
field_y_x.png
根据来源(作为先决条件,您将需要y 和 x 分别从 1 到 3 和 1 到 4 的文件):
\documentclass{scrartcl}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
width=0.3\textwidth,
height=0.3\textwidth,
xmin=-0.6,
xmax=0.6,
ymin=-0.6,
ymax=0.6,
zmin=-0.6,
zmax=0.6,
group style = {group size = 3 by 4,
horizontal sep = 2cm,
vertical sep = 2cm
}
]
\pgfplotsforeachungrouped \nx in {1,2,3,4}%
{
\pgfplotsforeachungrouped \ny in {1,2,3}%
{
\edef\mytitle{\noexpand\nextgroupplot[title=\ny-\nx];};
\mytitle
\edef\temp{\noexpand\addplot3 graphics[%
points={% important
(-0.7,-0.7, 0.7) => ( 641,1000-51)
(-0.7, 0.7,-1.5) => ( 904,1000-538)
(-0.7,-0.7,-1.5) => ( 641,1000-765)
( 0.7,-0.7,-1.5) => (1096,1000-897)
}] {field_\ny_\nx.png};};
\temp
}
}
\end{groupplot}
\end{tikzpicture}
\end{document}
答案1
当我尝试设置一个带有三个嵌套循环的巨大情节页面时,我偶然发现了这一点。
我认为你的问题可以通过替换第一个循环语句来解决
\pgfplotsforeachungrouped \nx in {1,2,3,4}%
经过
\pgfplotsinvokeforeach{1,2,3,4}%
至少在这里(没有实际文件 field_\nx_\ny.png,也不知道它们包含什么以及您想要绘制什么),它不再警告缺少文件(我仅创建了 \nx={1,2} 和 \ny={1,2} 来测试此错误消息)。此外,标题是正确的。
我没有查看 pgfplots 的代码,但一定有一些东西阻止 \pgfplotsforeachungrouped 在嵌套中使用。可能涉及一些临时宏名称,这些名称被内部循环覆盖。
请注意,此修复对我没有帮助,即如果您有两个以上的嵌套循环:正如您正确指出的那样,到目前为止 \pgfplotsinvokeforeach 不能嵌套。
写完并发布了这些内容后,我又在 Google 上搜索了一些内容:这个问题似乎与这个问题很相似更改组图中的参数:简而言之,使用包 etoolbox 提供的宏 \eappto 来构建宏链。
更新
为了完成此操作,我添加了使用 etoolbox 执行三个嵌套循环的示例代码。因此,在 pgfplot 的 axis 环境中执行以下内容:
\def\myPlots{}%
\pgfplotsforeachungrouped \myk in {1,2,4,10}{%
\pgfplotsforeachungrouped \myr in {1,2,4}{%
\eappto\myPlots{%
\noexpand\nextgroupplot[title = {$k=\myk, p=\myr$}]
}
\pgfplotsforeachungrouped \myseed in {420,...,429}{
\eappto\myPlots{%
\noexpand\addplot+[no marks] table[x=iteration,y=residual,col sep=comma] {somedatafile_k\myk_r\myr_seed\myseed.dat};
\noexpand\addlegendentry{\myseed};
}
}
}
}
\myPlots