如何防止 xcolor/pgf 中的色调超过 300°?(在 pgfplotstable 中进行数学运算)

如何防止 xcolor/pgf 中的色调超过 300°?(在 pgfplotstable 中进行数学运算)

好吧,对于任何真正了解xcolorpgf 或 TikZ 或其他东西的人来说,这可能是一个极其琐碎的问题。我尝试使用色度标尺来绘制热图/颜色矩阵,其值为 0<=x<=1。我主要基于adn 的这个答案

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{pgfplotstable}

\usepackage{xstring}

\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}\IfDecimal{##1}{%
                \cellcolor[hsb]{##1,.7,1.}}{}##1}%
                },
        columns/x/.style={
            column name={},
            postproc cell content/.code={}
        }
    }
}

\begin{document}
\begin{table}\caption{Correlation or something}
\centering
\pgfplotstabletypeset[color cells]{
x,a,b,c,d
a,0.9,0.3,-.1,0
b,0,.8,.6,.4
c,1,0.2,.95,.5
d,0,.1,.7,.85
}
\end{table}
\end{document}

看起来像这样:

色彩缤纷的桌子

色彩鲜艳,但它做了它应该做的事,即使对于不应该存在的小负数也是如此......除了:

0 和 1 产生相同的颜色

对于 1 的值,色调会重新回到 0/红色。我尝试减去一个很小的值,或者在内部将单元格内容乘以 .99 之类的,但我就是做不到任何这里的算术。


附言:如果您能推荐一些关于 xcolor、pgf 等的优秀文档,那就太好了。也许下次我就不用问这么愚蠢的问题了。


编辑:

好吧,我作业做得不太好。HSB 颜色空间不会突然回绕。它实际上是圆形的。这意味着紫色 (RGB [1, 0, 1]) 位于 300°,根据我的计算,这是十进制中非常方便的数字 .8333...。因此,必须将一个间隔映射到另一个间隔,在这种情况下应该相当简单:只需将值乘以 .8333。

答案1

对于算术,您可以检查参数是否为负数,以查看是否应执行最大值或最小值,然后可以\pgfmathresult在中使用\cellcolor。但在将其视为宏之前,应该先扩展其值\cellcolor。因此,按照 David 的回答,您可以将其隐藏到扩展定义中,然后将其扩展,然后执行它。

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{pgfplotstable}

\usepackage{xstring}

\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}%
                         \pgfmathparse{##1<0?max(0,##1):min(0.99,##1)}%
                         \edef\x{\noexpand\cellcolor[hsb]{\pgfmathresult,0.7,1.0}}\x##1%
            }
        },
        columns/x/.style={
            column name={},
            postproc cell content/.code={}
        }
    }
}

\begin{document}
\begin{table}\caption{Correlation or something}
\centering
\pgfplotstabletypeset[color cells]{
x,a,b,c,d
a,0.9,0.3,-.1,0
b,0,.8,.6,.4
c,1,0.2,.95,.5
d,0,.1,.7,.85
}
\end{table}
\end{document}

那么结果希望是正确的(这里是色盲)。顺便说一句,这个问题没有错。以下是所有软件包的手册 :-)TeXdoc.net

在此处输入图片描述


编辑

该代码可以轻松调整以适应改变的问题,如下所示:

\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}%
                         \pgfmathparse{0.8333*##1}%
                         \edef\x{\noexpand\cellcolor[hsb]{\pgfmathresult,0.7,1.0}}\x##1%
            }
        },
        columns/x/.style={
            column name={},
            postproc cell content/.code={}
        }
    }
}

结果如下:

固定矩阵

答案2

我很确定我不明白这个问题,但是这会强制将 >=1 的值变为 0.99,将 <= 0 的值变为 0.01。

\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}\IfDecimal{##1}{%
      \edef\tmp{\noexpand\cellcolor[hsb]{%
       \ifdim##1pt>0pt  \ifdim##1pt<1pt ##1 \else 0.99 \fi \else 0.01\fi,.7,1.}}%
                \tmp}{}##1}%
                },
        columns/x/.style={
            column name={},
            postproc cell content/.code={}
        }
    }
}

相关内容