pgfplotsforeachungrouped 在 groupplot 中

pgfplotsforeachungrouped 在 groupplot 中

我想用 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

相关内容