我需要一些帮助。我正在尝试使用 foreach 循环和 pgfmathresult 为条形图分配不同的颜色以获得颜色渐变。这是一个简单的例子:
\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
Label 1 2 3
R1 3 2 1
R2 2 1 3
R3 1 2 3
}\testdata
\begin{tikzpicture}
\begin{axis}[ybar stacked, ymin=0, xtick=data, xticklabels from table={\testdata}{Label}]
\foreach \s in {1,...,3}{
\pgfmathparse{\s*30}
\addplot [fill=blue!\pgfmathresult!green] table [y=\s, meta=Label,x expr=\coordindex] {\testdata};
}
\end{axis}
\end{tikzpicture}
\end{document}
但我得到的结果没有梯度
当我运行几乎相同的代码(没有 pgfplot)时 Jet:
\begin{tikzpicture}
\foreach \s in {1,...,3} {
\pgfmathparse{(\s*30)}
\draw[blue!\pgfmathresult!green, thick]
(0,\s * .2) -- (1,\s * .2)
;
}
\end{tikzpicture}
有人知道这里出了什么问题以及如何解决吗?
答案1
您需要先扩展pgfmathresult
它,然后再传递给\addplot
。要将扩展的值注入命令内部,一种方法是使用常见的习惯用法LaTeX3 - 展开嵌套参数
(附注,addplot
最终会扩大它,但只在最后;因此所有颜色都会扩大到相同的值)
\def\plotcommand#1{
\addplot [fill=blue!#1!green] table [y=\s, meta=Label,x expr=\coordindex] {\testdata};
}
\begin{tikzpicture}
\begin{axis}[ybar stacked, ymin=0, xtick=data, xticklabels from table={\testdata}{Label}]
\foreach \s in {1,...,3}{
\pgfmathparse{\s*30}
\expandafter\plotcommand\expandafter{\pgfmathresult}
}
\end{axis}
\end{tikzpicture}
笔记
我对 TikZ 不太熟悉,也许 TikZ 提供了更易于阅读的内置解决方案。阅读以下问题后,我确信它实际上不可能更干净。- 使用新的 LaTeX 内核
\ExpandArgs{V}\plotcommand\pgfmathresult
,您可以看到我如何调用具有多个参数的宏的 \expandafter ? - 如果你把
plotcommand
命令定义放在 foreach 里面,你需要将其加倍,因为我发现#
有一些奇怪的foreach
命令“bug”Tikz 和 Beamer 有问题类似但不完全相同 - 如果你不介意使用重型包装完成一次性任务,我推荐我的包装
\usepackage{execinside}
[... common preamble ...]
\begin{tikzpicture}
\begin{axis}[ybar stacked, ymin=0, xtick=data, xticklabels from table={\testdata}{Label}]
\foreach \s in {1,...,3}{
\pgfmathparse{\s*30}
\execinside{
\addplot [fill=blue!\EIexpand\pgfmathresult!green] table [y=\s, meta=Label,x expr=\coordindex] {\testdata};
}
}
\end{axis}
\end{tikzpicture}
类似问题: