如何使用 TikZ 将值映射到颜色?

如何使用 TikZ 将值映射到颜色?

我正在尝试绘制矩形,每个矩形都有一个对应的值,这些值将根据该值从颜色图中映射到颜色。这就是我想要编写代码的方式。缺少的是从 到\myvalue的映射\mycolor

\documentclass{standalone}

\usepackage{colortbl}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\pgfplotsset{compat=1.9}

\newcommand*{\ListOfRectanglesColor}{%
  0/0/1/1/blue,
  1/1/2/2/red,
}

\newcommand*{\ListOfRectanglesValues}{%
  0/0/1/1/0.3,
  1/1/2/2/0.6,
}

\begin{document}
\begin{tikzpicture}
  \foreach \sXa/\sYa/\sXb/\sYb/\mycolor in \ListOfRectanglesColor {
    \fill[\mycolor] (\sXa, \sYa) rectangle (\sXb, \sYb);
  }
  %\foreach \sXa/\sYa/\sXb/\sYb/\myvalue in \ListOfRectanglesColor {
  %  what code will define \mycolor as a color based on \myvalue?
  %  and a specified color map?
  %  \fill[\mycolor] (\sXa, \sYa) rectangle (\sXb, \sYb);
  %}
\end{tikzpicture}
\end{document}

根据评论进行编辑

问题:如何将值映射到颜色?如果 TeX 代码有注释,我将非常感激,这样我就能理解代码的工作原理。

为简单起见,映射函数的形式为

\valuetocolor{value-min}{value-max}{color-min}{color-max}{value}

浮点数value-minvalue-max将分别映射到两个定义的颜色color-mincolor-max。我们可以假设value-minvalue-max。我想将浮点数映射到和value之间的线性插值。更准确地说,设是使得的值。然后我想返回颜色。color-mincolor-maxλvalue = λ value-min + (1 - λ) value-max\valuetocolor{value-min}{value-max}{color-min}{color-max}{value}λ color-min + (1 - λ) color-max


相关 TeX.SX 问题

我知道有一个相关问题需要一些帮助来开始使用 TikZ、groupplots 和矩阵的颜色映射 其中有 TeX 代码可以完成从值到颜色的映射,从而实现更复杂的颜色图。不幸的是,由于我对 TeX/PGF 的了解有限,我无法理解代码的工作原理。

答案1

\colorlet包中的宏可以xcolor定义两种颜色之间的混合(color1color2此示例中):

\colorlet{color1}{red}
\colorlet{color2}{blue}
\colorlet{my mixed color}{color1!\lambda!color2}

该值必须是 0(为蓝色)至 100(为红色)\lambda之间的整数。my mixed colormy mixed color

默认情况下,颜色和混合都在 RGB 颜色空间中。如果两种颜色都在 HSB 颜色空间中,则混合也在 HSB 颜色空间中:

\colorlet{color1}[hsb]{red}
\colorlet{color2}[hsb]{blue}
\colorlet{my mixed color}[rgb]{color1!\lambda!color2}

下面是一个简单的示例,其中包含red和之间的两个颜色图lime(左边是 RGB 颜色空间,右边是 HSB 颜色空间),使用\myvalue介于 0 ( \min) 和 20 ( \max) 之间的值 ( ):

在此处输入图片描述

\documentclass[tikz]{standalone}

\begin{document}
\begin{tikzpicture}
  \colorlet{color min rgb}[rgb]{red}
  \colorlet{color max rgb}[rgb]{lime}

  \colorlet{color min hsb}[hsb]{red}
  \colorlet{color max hsb}[hsb]{lime}

  \def\min{0}
  \def\max{20}

  \foreach \pos in {0,...,20}{
    \pgfmathsetmacro\myvalue{\pos}

    \pgfmathtruncatemacro\lambda{(\myvalue-\min)/(\max-\min)*100}
    \colorlet{my color rgb}[rgb]{color min rgb!\lambda!color max rgb}
    \colorlet{my color hsb}[rgb]{color min hsb!\lambda!color max hsb}

    \fill[fill=my color rgb,draw=white] (1cm,\pos cm) rectangle +(1cm,1cm);
    \fill[fill=my color hsb,draw=white] (2cm,\pos cm) rectangle +(1cm,1cm);
    \node at (3.5cm, \pos cm + 5mm) {\myvalue};
  }
\end{tikzpicture}
\end{document}

相关内容