好吧,对于任何真正了解xcolor
pgf 或 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}
看起来像这样:
色彩鲜艳,但它做了它应该做的事,即使对于不应该存在的小负数也是如此......除了:
对于 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={}
}
}
}