这是使用 \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
。)