我正在尝试通过 HSL 颜色空间绘制 S=1 平面。据我所知,HSL 颜色空间未内置于 pgfplots 中,但 HSV(或 HSB)内置于其中。因此,我尝试使用从 HSL 到 HSV 的简单转换,如下所示(请注意限制 x 范围以避免在此 MWE 中除以 0)。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\begin{document}
\begin{tikzpicture}
\def\S{1} % saturation (S)
\begin{axis}[
view={0}{90}, % z rotation, x rotation
domain=0:1,
xmin=0.1, xmax=1, % lightness (L)
ymin=0, ymax=1, % hue (H)
samples=30,
axis line style={draw=none},
tick style={draw=none},
xticklabels={,,},
yticklabels={,,},
width=500px,
height=100px]
\addplot3[surf, shader=interp,
mesh/color input=explicit mathparse,
point meta={symbolic={hsb={y},{2-2*x/(x+\S*min(x,1-x))},{x+\S*min(x,1-x)}}},
shader=interp] ({x},{y},{1});
\end{axis}
\end{tikzpicture}
\end{document}
但是,我得到了错误,
! Number too big.
<argument> 0000005000000000
这是由于
{2-2*x/(x+\S*min(x,1-x))},{x+\S*min(x,1-x)}
hsb={} 内的公式(倒数第三行)。我认为问题是由于在 hsb={} 内提供了两项公式造成的。一项公式似乎可以正常工作。手册显示,如果没有 hsb={}(因此这是默认的 RGB),两项公式也可以正常工作。我正在使用 mesh/color input=explicit mathparse。我没有主意了。
有人有什么建议吗?谢谢。
答案1
这不是一个完整的答案,而是一个提示和解决方法,太长了,无法放在评论中;我认为问题出在从“hsb”到 RGB 颜色空间的内部计算中。我建议你自己进行 RGB 转换(我不知道公式)以查看转换失败的位置。
如果将点元更改为(注意组件中的 0.99 b
):
point meta={symbolic={hsb={y},
{2-2*x/(x+\S*min(x,1-x))},
{0.99*(x+\S*min(x,1-x))}}},
为了避免值太接近1
,你有一个正确的编译,并且输出是:
(我不知道这是否合理)
您也收到了警告Package pgfplots Warning: Axis range for axis z is approximately empty; enlargi ng it (it is [1.0000000000:1.0000000000]) on input line 30
,但我认为这是意料之中的。
我的发现:我发现您使用的两个公式在计算上没有问题,如您在此处所见:
\documentclass[tikz, border=2.178mm]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\newcommand\myS{1} % saturation (S)
\begin{axis}[
xmin=0, xmax=1,
domain=0:1,
xlabel = {$x$},
ylabel = {$y$},
clip mode = individual,
samples=100,
]
\addplot[blue, thick] { 2-2*x/(x+\myS*min(x,1-x)) };
\addplot[red, thick] {x+\myS*min(x,1-x)};
\end{axis}
\end{tikzpicture}
\end{document}
无关,但是:
不要使用
\def\S
。如果你使用\newcommand
,你会发现\S
已经定义了。在这种情况下,这不是问题,但有时事情可能会爆发……你甚至可以简化表达式并在 中使用常量pgfmath
,例如\tikzset{declare function={S=1;}}
然后
S
在公式中简单地使用。始终添加一个
\pgfplotsset{compat=...}
,至少使用高于 1.11 的版本,此时坐标的默认值会发生axis
变化,否则您有时会遇到麻烦。