我正在努力解决绘制曲线族这个相当简单的问题。
\documentclass[border=1mm]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}
\pgfplotstableread{
1 1
2 4
3 9
4 16
5 25
}\dataQuad
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
legend pos=north west,
domain=0:5,
xlabel=${x}$,
ylabel=${y}$]
\foreach \y/\c in {2/black,3/green,4/red,5/brown}{%
\edef\temp{\noexpand\addplot[color=\c,line width=1pt] {x^\y};}
\temp
\addlegendentryexpanded{$y=x^\y$}
}
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[%
legend pos=north west,
domain=0:5,
cycle list name=color,
xlabel=${x}$,
ylabel=${y}$]
\addplot [smooth] table[x index=0, y index=1] {\dataQuad};
\legend{$y=x^2$}
\foreach \y in {3, 4, 5} {%
% \foreach \y/\c in {3/green,4/red,5/brown}{%
\addplot [smooth] table[x index=0, y expr=\thisrowno{0}^\y] {\dataQuad};
% \edef\temp{\noexpand\addplot [smooth] table[x index=0, y expr=\thisrowno{0}^\y] {\dataQuad};}
% \temp
\addlegendentryexpanded{$y=x^\y$}
}
\end{axis}
\end{tikzpicture}
\end{document}
我希望在使用包含一些数学表达式的表格时,左侧显示相同的结果。一个问题是在取消注释第二个 tikzpicture 中的行时处理颜色管理(通过更改foreach-loop)。我无法让它工作。似乎是扩展的问题。
非常感谢您的任何建议!
谢谢保罗
答案1
编辑:这里解释了您的情况出了什么问题。但是,Jake 的方法是一种最佳实践:它依赖于cycle list
简化样式(颜色)管理并完全避免该问题。
复杂的结构\edef
是不完整的;这是一个扩展问题(正如您所怀疑的那样)。
问题是\edef
(Expanded DEFinition) 试图扩展每个遇到的宏。就你的情况而言,你只想扩展\y
和\c
。因此,你必须保护遇到的每个其他宏。就你的情况而言,\thisrowno
和缺少保护\dataQuad
。通过在要保护的宏前面加上前缀来实现“保护” \noexpand
。
综合起来,我们可以得出
\documentclass[border=1mm]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}
\pgfplotstableread{
1 1
2 4
3 9
4 16
5 25
}\dataQuad
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
legend pos=north west,
domain=0:5,
xlabel=${x}$,
ylabel=${y}$]
\foreach \y/\c in {2/black,3/green,4/red,5/brown}{%
\edef\temp{\noexpand\addplot[color=\c,line width=1pt] {x^\y};}
\temp
\addlegendentryexpanded{$y=x^\y$}
}
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[%
legend pos=north west,
domain=0:5,
cycle list name=color,
xlabel=${x}$,
ylabel=${y}$]
\addplot [smooth] table[x index=0, y index=1] {\dataQuad};
\legend{$y=x^2$}
\foreach \y/\c in {3/green,4/red,5/brown}{%
\edef\temp{\noexpand\addplot [color=\c,smooth] table[x index=0, y expr=\noexpand\thisrowno{0}^\y] {\noexpand\dataQuad};}
\temp
\addlegendentryexpanded{$y=x^\y$}
}
\end{axis}
\end{tikzpicture}
\end{document}
答案2
对于这样的应用程序,PGFPlots 提供了自己的循环宏,可以在正确的时间扩展并执行绘图命令:
\pgfplotsinvokeforeach{<list>}{ <code, with #1 the current list value> }
\documentclass[border=1mm]{standalone}
\usepackage{pgfplots, pgfplotstable}
\pgfplotsset{compat=1.8}
\pgfplotstableread{
1 1
2 4
3 9
4 16
5 25
}\dataQuad
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
legend pos=north west,
domain=0:5,
cycle list={black, green, red, brown},
xlabel=${x}$,
ylabel=${y}$
]
\pgfplotsinvokeforeach{2, 3, 4, 5}{%
\addplot +[smooth, thick] table[x index=0, y expr=\thisrowno{0}^#1] {\dataQuad};
\addlegendentryexpanded{$y=x^#1$}
}
\end{axis}
\end{tikzpicture}
\end{document}