tikz foreach 的问题

tikz foreach 的问题

我正在使用 foreach 循环将图添加到轴环境中,并希望每个图都有自己的颜色。为了实现这一点,我尝试了以下方法:

\foreach \x/\barcolor in {1/red, 2/green, 3/blue, 4/gray}{
    \addplot[fill=\barcolor] table[x=key,y expr={\thisrowno{\x}/\thisrowno{6}}] {data.dat};
}

但不知何故,变量有问题\barcolor。如果我使用fill=blue循环,运行完全正常,但显然所有条形都是蓝色的。展开循环并手动添加四个图也可以正常工作:

\addplot[fill=red] table[x=key,y expr={\thisrowno{1}/\thisrowno{6}}] {data.dat};
\addplot[fill=green] table[x=key,y expr={\thisrowno{2}/\thisrowno{6}}] {data.dat};
\addplot[fill=blue] table[x=key,y expr={\thisrowno{3}/\thisrowno{6}}] {data.dat};
\addplot[fill=gray] table[x=key,y expr={\thisrowno{4}/\thisrowno{6}}] {data.dat};

我无法弄清楚我的循环存在什么问题,希望您能帮助我。

答案1

您可以使用 来cycle list表示颜色。

例子:

\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{filecontents*}{data.dat}
key 1 2 3 4 5 6
1   1 2 3 4 5 6
2   2 3 4 5 6 7
3   7 8 2 1 3 8
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
  ybar,
  enlarge x limits={abs=30pt},
  cycle list={red,green,blue,gray}
]
\foreach \x in {1,...,4}{
\addplot+[fill,draw=black] table [x=key, y expr={\thisrowno{\x}/\thisrowno{6}}] {data.dat};}
\end{axis}
\end{tikzpicture}
\end{document}

结果:

在此处输入图片描述


定义cycle list每个命令的绘图规范,\addplot无需明确指定键。第一个绘图使用列表中的第一个条目,第二个绘图使用第二个条目,依此类推。

如果您使用的\addplot+[...]是 的规范,cycle list则由明确给定的键附加。在上面的示例中,每个图的颜色由 指定,并且图选项由和cycle list附加。filldraw=black

如果使用没有的明确规范,+则不使用循环列表。这意味着\addplot[...]即使括号为空也不会使用循环列表。

答案2

我只是想在问题的评论部分(以及我在那里发布的链接)提出我对讨论的个人结论。

以下代码是符合我需要的一个工作示例:

\foreach \x/\barcolor in {1/red, 2/green, 3/blue, 4/gray}{
    \edef\temp{\noexpand\addplot[fill=\barcolor]}
    \temp table[x=key,y expr={\thisrowno{\x}/\thisrowno{6}}] {data.dat};
}

\x我认为这是 egreg 提案的更清晰的版本,因为我对于两件不同的事情的重用有点困惑。

相关内容