我正在尝试使用构建条形图\foreach
。我想根据定义的变量为每个条形着色。(这是一个更广泛项目的一部分,所以我无法更改它们的定义方式。)
使用\count
宏在每次迭代时获取索引值,我想用它来选择条形的正确颜色。但是宏\n
(即索引)按原样获取,而不是其值。因此我收到有关 的错误Undefined color 'color@\n'
。
我已经使用过,检查过typeout
该值是否正确,但它似乎不是一个字符串或者类似的东西......
以下是 MWE:
\documentclass{article}
\usepackage{tikz,pgfplots,pgffor}
\colorlet{color@1}{green}
\colorlet{color@2}{yellow}
\colorlet{color@3}{orange}
\colorlet{color@4}{red}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xtick={1,...,4},
x tick style={draw=none},
xticklabel={1},
ymin=0,
every axis plot/.append style={ybar,fill}
]
\foreach \x [count=\n] in {1,3,2,10}{
\typeout{index is \n}
\addplot[color=color@\n ] coordinates {(\n,\x)};
% Here is the error about color@\n undefined.
}
\end{axis}
\end{tikzpicture}
\tikz[x=0.75cm,y=0.75cm]
\foreach \x [count=\xi] in {a,...,d}
\foreach \y [count=\yi] in {\x,...,d}
\node [draw, top color=white, bottom color=color@\xi, minimum size=0.666cm]
at (\xi,-\yi) {$\xi,\yi$};
\end{document}
第二个示例运行良好,并且是根据文档改编的。我看不出第一个示例中的错误在哪里。
可能是扩展错误吗?
非常感谢
答案1
可选参数的扩展\addplot
确实非常棘手。最后,我使用了listofitems
来定义和扩展颜色。参见附录对于没有的版本listofitems
。
\documentclass{article}
\usepackage{tikz,pgfplots,pgffor,listofitems}
\pgfplotsset{compat=1.17}
\readlist\colorlist{green,yellow,orange,red}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xtick={1,...,4},
x tick style={draw=none},
xticklabel={1},
ymin=0,
every axis plot/.append style={ybar,fill}
]
\readlist\mylist{1,3,2,10}
\foreachitem \x \in \mylist[]{
\typeout{index is \xcnt}
\edef\tmp{color=\colorlist[\xcnt]}
\expandafter\addplot\expandafter[\tmp]
coordinates {(\xcnt,\x)};
}
\end{axis}
\end{tikzpicture}
\tikz[x=0.75cm,y=0.75cm]
\foreach \x [count=\xi] in {a,...,d}
\foreach \y [count=\yi] in {\x,...,d}
\node [draw, top color=white, bottom color={\colorlist[\xi]}, minimum size=0.666cm]
at (\xi,-\yi) {$\xi,\yi$};
\end{document}
附录
版本不使用listofitems
。在这两种情况下,关键是在将颜色呈现给 之前对其进行扩展\addplot
,方法是
\edef\tmp{color=color@\n}
\expandafter\addplot\expandafter[\tmp]
coordinates {(\n,\x)};
妇女权利委员会:
\documentclass{article}
\usepackage{tikz,pgfplots,pgffor}
\colorlet{color@1}{green}
\colorlet{color@2}{yellow}
\colorlet{color@3}{orange}
\colorlet{color@4}{red}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xtick={1,...,4},
x tick style={draw=none},
xticklabel={1},
ymin=0,
every axis plot/.append style={ybar,fill}
]
\foreach \x [count=\n] in {1,3,2,10}{
\typeout{index is \n}
\edef\tmp{color=color@\n}
\expandafter\addplot\expandafter[\tmp]
coordinates {(\n,\x)};
}
\end{axis}
\end{tikzpicture}
\tikz[x=0.75cm,y=0.75cm]
\foreach \x [count=\xi] in {a,...,d}
\foreach \y [count=\yi] in {\x,...,d}
\node [draw, top color=white, bottom color=color@\xi, minimum size=0.666cm]
at (\xi,-\yi) {$\xi,\yi$};
\end{document}