![pgfplots:如何使用 foreach 迭代绘图样式?](https://linux22.com/image/400872/pgfplots%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20foreach%20%E8%BF%AD%E4%BB%A3%E7%BB%98%E5%9B%BE%E6%A0%B7%E5%BC%8F%EF%BC%9F.png)
对于以下内容,变量\mystyle
没有按预期工作。
因此,我该如何:
1- 通过制作三个值列表来优化代码\myalph
,\mystyle
并\mylabel
对其进行迭代,foreach
而不是逐个输入组合,
2-然后修复代码以使其\mystyle
作为线条样式选项工作?
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\pgfplotsset{alph/.initial=1}
\newcommand*{\getalph}{\pgfkeysvalueof{/pgfplots/alph}}
\begin{tikzpicture}[
declare function = { CFDfixedalph(\time) = \time^(\getalph-1); } ]
\begin{semilogxaxis}
\foreach \myalph/\mylabel/\mystyle in {0.1/{one}/dashed , 0.5/{two}/solid , 0.9/{three}/red}{
\addplot[alph=\myalph, domain = 1e-6 : 1e6, samples = 100, \mystyle] {CFDfixedalph(x)};
\addlegendentryexpanded{\mylabel}
}
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
答案1
pgfplots 中的循环存在众所周知的缺陷foreach
,这在章节中有很好的解释。8.1 实用命令手册 v1.16。这就是我使用\pgfplotsinvokeforeach
和一些\noexpand
技巧的原因。请注意,这不是使其工作的唯一方法,而是一种可以轻松扩展到更多循环变量的可能方法。那么我相信你在回答你之前的问题当然,不是真的作弊,因为答案真的很棒,一针见血,解释清楚。只是如果我想解决你的问题,我只需声明CFDfixedalph
为两个变量的函数,事实确实如此。然后你不需要任何 pgf 键技巧,只需插入你喜欢的 alpha 值。总之,以下方法有效。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}[
declare function = { CFDfixedalph(\time,\alph) = \time^(\alph-1); } ]
\begin{semilogxaxis}
\edef\lstAlphs{0.1,0.5,0.9}
\edef\lstLabels{"one","two","three"}
\edef\lstStyles{"dashed","solid","red"}
\pgfplotsinvokeforeach{0,1,2}{
\pgfmathsetmacro{\myalph}{{\lstAlphs}[#1]} % <- CCB (carefully count braces)
\pgfmathsetmacro{\mystyle}{{\lstStyles}[#1]}
\pgfmathsetmacro{\mylabel}{{\lstLabels}[#1]}
\edef\temp{\noexpand\addplot[domain = 1e-6 : 1e6, samples = 100,\mystyle]
{CFDfixedalph(x,\myalph)};}
\temp
\addlegendentryexpanded{\mylabel}
}
\end{semilogxaxis}
\end{tikzpicture}
\end{document}