我正在尝试绘制一个图像,它基本上是一个强度值矩阵。我希望配色方案的范围从最低的黑色到最高的白色,中间有一个定义的颜色。(我的方法基于此回答类似问题。
以下是 MWE:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[scale=1]
\foreach \y [count=\n] in { %this is normally a VERY large matrix
{0,50},
{75,100},
} {\foreach \x [count=\m] in \y {\fill[white!\x!red!\x!black] (1*\n,-1*\m) rectangle ++(1,1);}}
\end{tikzpicture}
\end{document}
问题是,我的绝对值范围从 0 到 400 左右,而按照我目前的方法,我需要将它们标准化为 0 到 100 的范围。从技术上讲,这可行,但这意味着我丢失了 3/4 的颜色信息。不幸的是,数据非常敏感,我现在正在寻找一种使用更大范围的方法。
我的新方法是将配色方案分为两部分,这样我至少可以使用 0 到 200 之间的值。但是,这似乎不起作用,而且我不太擅长使用 LaTeX 中的 if 命令。(我知道Christian Feuersänger 对上述同一问题的回答,但我完全不理解它,因此很难将它应用到我的情况。)
\documentclass[tikz]{standalone}
\usepackage{calc}
\usepackage{ifthen}
\begin{document}
\begin{tikzpicture}[scale=1]
\foreach \y [count=\n] in {
{0,100},
{150,200},
}
{\foreach \x [count=\m] in \y {
\fill[\ifnum\x<100 {white!\x!red} \else {red!{\x/2}!black}\fi] (1*\n,-1*\m) rectangle ++(1,1);
}}
\end{tikzpicture}
\end{document}
有人能告诉我我的错误是什么,或者如何更有效地解决这个问题?
答案1
不确定您是否想要实现这个精确的结果,但经过更正的代码是这样的:
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\usepackage{xcolor}
\usepackage{ifthen}
\begin{document}
\begin{tikzpicture}[scale=1]
\foreach \y [count=\n] in {
{0,100},{150,200}}
{\foreach \x [count=\m] in \y {
\pgfmathtruncatemacro\myx{\x/2}%
\xdef\myColor{\ifnum\x<100 white!\x!red\else red!\myx!black\fi}%
\fill[color={\myColor}] (1*\n,-1*\m) rectangle ++(1,1);
}}
\end{tikzpicture}
\end{document}
编辑:
为了不丢失范围(0-400),您可以在红色中添加一些绿色(一半绿色..使其呈黄色)并保持 RGB 定义(0-255)...因此,您的范围将是 2\times 255 = [0-510]):
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\usepackage{xcolor}
\usepackage{ifthen}
\begin{document}
\begin{tikzpicture}[scale=1]
\foreach \y [count=\n] in {
{0,100, 200},{150,200,400}}
{\foreach \x [count=\m] in \y {
\pgfmathtruncatemacro\myx{\ifnum\x>255{\x/2}\else{\x}\fi}%
\pgfmathtruncatemacro\myy{\ifnum\x>255 127\else 0\fi}%
\definecolor{myColor\m}{RGB}{\myx,\myy,0}%
\fill[color={myColor\m}] (1*\n,-1*\m) rectangle ++(1,1);
}}
\end{tikzpicture}
\end{document}
编辑2:
要获得更多“梯度”方法,请使用以下函数:
\pgfmathtruncatemacro\myx{\ifnum\x>255{255}\else{\x}\fi}%
\pgfmathtruncatemacro\myy{\ifnum\x>255{\x-255}\else 0\fi}%