使用 \foreach 在节点矩阵中添加包含对 pgfplots 对象的引用的行

使用 \foreach 在节点矩阵中添加包含对 pgfplots 对象的引用的行

这是使用 \pgfplotsinvokeforeach 在节点矩阵中创建行.考虑下面的最小工作示例:

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.17, filter discard warning=false}

\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}
\begin{axis}
  \addplot {2*x + 1};
  \label{myPlotA}

  \addplot {3*x + 3};
  \label{myPlotB}

  \addplot {x + 3};
  \label{myPlotC}

  \matrix (myMatrix) [ matrix of nodes, at={(4,-5)} ] {
    \foreach\myletter in {A,B,C}{
      \ref{myPlot\myletter} \myletter
    } \\
    %\ref{myPlotA} A \\
    %\ref{myPlotB} B \\
    %\ref{myPlotC} C \\
  };

\end{axis}

\end{tikzpicture}

\end{document}

输出如下: 在此处输入图片描述 但我感兴趣的是产生注释部分给出的行为,即如下所示的输出 在此处输入图片描述 以自动化方式使用\foreach或类似命令。我遇到了麻烦,因为\\在矩阵行之间插入所需的中断会导致循环内部出现编译错误\foreach

答案1

您可以先建立一个临时变量,然后一次性将其扩展到整个矩阵内容。临时变量必须是全局的,因为\foreach每次迭代都会使用一个组。

\documentclass{article}

\usepackage{etoolbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}
\begin{axis}
  \addplot {2*x + 1};
  \label{myPlotA}
  \addplot {3*x + 3};
  \label{myPlotB}
  \addplot {x + 3};
  \label{myPlotC}
  \makeatletter
    \let\@gtempa\@empty
    \foreach\myletter in {A,B,C} {
      \xappto\@gtempa{\noexpand\ref{myPlot\myletter} \myletter\noexpand\\}
    }
    \matrix (myMatrix) [ matrix of nodes, at={(4,-5)} ] {
      \@gtempa
    };
  \makeatother
\end{axis}

\end{tikzpicture}

\end{document}

不过,我不明白为什么你不直接使用pgfplots“内置图例功能”。

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{document}

\begin{tikzpicture}
\begin{axis} [
      legend style={
        draw=none,
        at={(axis cs:4,-5)},
        anchor=center,
      },
    ]
  \addplot {2*x + 1};
  \addlegendentry{A}
  \addplot {3*x + 3};
  \addlegendentry{B}
  \addplot {x + 3};
  \addlegendentry{C}
\end{axis}

\end{tikzpicture}

\end{document}

(如果您只想将图例放在那个角落的某个地方,那么您只需使用 即可legend pos=south east。)

相关内容