利用曲线系列进行色彩管理

利用曲线系列进行色彩管理

我正在努力解决绘制曲线族这个相当简单的问题。

\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}

相关内容