使用 addplot 和 pgfmathresult 获取颜色

使用 addplot 和 pgfmathresult 获取颜色

我需要一些帮助。我正在尝试使用 foreach 循环和 pg​​fmathresult 为条形图分配不同的颜色以获得颜色渐变。这是一个简单的例子:

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

笔记

  1. 我对 TikZ 不太熟悉,也许 TikZ 提供了更易于阅读的内置解决方案。 阅读以下问题后,我确信它实际上不可能更干净。
  2. 使用新的 LaTeX 内核\ExpandArgs{V}\plotcommand\pgfmathresult,您可以看到我如何调用具有多个参数的宏的 \expandafter ?
  3. 如果你把plotcommand命令定义放在 foreach 里面,你需要将其加倍,因为我发现#有一些奇怪的foreach命令“bug”Tikz 和 Beamer 有问题类似但不完全相同
  4. 如果你不介意使用重型包装完成一次性任务,我推荐我的包装
\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}

类似问题:

相关内容