我正在使用 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
附加。fill
draw=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 提案的更清晰的版本,因为我对于两件不同的事情的重用有点困惑。