通过 TikZ 对表格中的阴影进行参数化

通过 TikZ 对表格中的阴影进行参数化

我想根据表格中的值对其进行一些阴影处理。例如,如果您看到下表:

  a  b   c   d 
a 90 10  0   0
b 0  80  10  10
c 0  0   95  5
d 0  10  5   85

我想根据数值自动为每个数字单元格添加黑色和白色混合阴影。也就是说,(a,a) = 90应该是black!90,并且(c,d) = 5应该是black!5。此外,如果您可以参数化着色操作,以便可以定义颜色,并且如果我们使用值或补码,那就太好了。

我在想通过文件中的数据参数绘制不同的 tikz 形状,但我不明白如何在表格中实现这一点。

您能给我一些关于如何实现这种自动造型的建议吗?

答案1

您可以使用 pgfplotstable 和xcolor带有[table]选项的包,它会为您提供\cellcolor命令。

这是一种新样式,\pgfplotstabletypeset它根据单元格的值将单元格着色为不同的灰色,如果背景黑色超过 50%,则以白色打印该值。

命令

\pgfplotstabletypeset[color cells]{
 x,a,b,c,d      % The first column needs a name
 a,90,10,0,0
 b,0,80,10,10
 c,0,0,95,5
 d,0,10,5,85
 }

然后会给你(此处显示并带有标题)

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

\pgfplotstableset{
    color cells/.style={
        col sep=comma,
        string type,
        postproc cell content/.code={%
                \pgfkeysalso{@cell content=\rule{0cm}{2.4ex}\cellcolor{black!##1}\pgfmathtruncatemacro\number{##1}\ifnum\number>50\color{white}\fi##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,90,10.5,0,0
b,0,80,10,10
c,0,0,95,5
d,0,10,5,85
}
\end{table}
\end{document}

答案2

我想保留表格的使用,所以我使用宏来格式化单元格。这对我来说肯定更长,但更熟悉。

\def\cca#1{\cellcolor{black!#10}\ifnum #1>5\color{white}\fi{#1}}
%For ranges 0-10, multiply by 10 by adding 0 after #1

\begin{table}[!t]
\caption{Table Caption}
\label{tab1}
\centering
{\setlength\tabcolsep{0.1pt}%
\begin{tabular}{ccccccccccccccc}
& $D_1$ & $D_2$ & $D_3$ & $D_4$ & $D_5$ & $D_6$ && & $D_1$ & $D_2$ & $D_3$ & $D_4$ & $D_5$ & $D_6$ \\
$D_1$ & & \cca{0} & \cca{0} & \cca{0} & \cca{2} & \cca{0} && $D_1$ && \cca{0} & \cca{0} & \cca{2} & \cca{2} & \cca{2} \\
$D_2$ & \cca{0} & & \cca{2} & \cca{0} & \cca{2} & \cca{0} && $D_2$ & \cca{0} &  & \cca{3} & \cca{0} & \cca{0} & \cca{2} \\
$D_3$ & \cca{7} & \cca{4} &  & \cca{3} & \cca{0} & \cca{4} && $D_3$ & \cca{0} & \cca{4} &  & \cca{4} & \cca{2} & \cca{0} \\
$D_4$ & \cca{3} & \cca{0} & \cca{7} &  & \cca{4} & \cca{0} && $D_4$ & \cca{0} & \cca{0} & \cca{5} &  & \cca{0} & \cca{0} \\
$D_5$ & \cca{3} & \cca{7} & \cca{7} & \cca{2} &  & \cca{4} && $D_5$ & \cca{2} & \cca{2} & \cca{0} & \cca{4} &  & \cca{4} \\
$D_6$ & \cca{2} & \cca{2} & \cca{7} & \cca{2} & \cca{6} &  && $D_6$ & \cca{2} & \cca{2} & \cca{3} & \cca{0} & \cca{4} & \\
\end{tabular}}
\end{table}

表格结果

答案3

如果您希望单元格背景颜色根据其值而改变。

相关性或其他类型的矩阵

您可以使用以下代码。

\documentclass[english]{article}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{babel}
\usepackage[table]{xcolor}
\usepackage{collcell}
\usepackage{hhline}
\usepackage{pgf}
\usepackage{multirow}

\def\colorModel{hsb} %You can use rgb or hsb

\newcommand\ColCell[1]{
  \pgfmathparse{#1<50?1:0}  %Threshold for changing the font color into the cells
    \ifnum\pgfmathresult=0\relax\color{white}\fi
  \pgfmathsetmacro\compA{0}      %Component R or H
  \pgfmathsetmacro\compB{#1/100} %Component G or S
  \pgfmathsetmacro\compC{1}      %Component B or B
  \edef\x{\noexpand\centering\noexpand\cellcolor[\colorModel]{\compA,\compB,\compC}}\x #1
  } 
\newcolumntype{E}{>{\collectcell\ColCell}m{0.4cm}<{\endcollectcell}}  %Cell width

\begin{document}
\newcommand\items{3}   %Number of classes
\arrayrulecolor{white} %Table line colors
\noindent\begin{tabular}{c*{\items}{|E}|}
\multicolumn{1}{c}{} & 
\multicolumn{1}{c}{A} & 
\multicolumn{1}{c}{B} & 
\multicolumn{1}{c}{C} \\ \hhline{~*\items{|-}|}
A  & 100   & 0  & 10   \\ \hhline{~*\items{|-}|}
B  & 10   & 80  & 10   \\ \hhline{~*\items{|-}|}
C  & 30   & 0   & 70   \\ \hhline{~*\items{|-}|}
\end{tabular}

\end{document}

您可以使用 RGB 或 HSB 来定义您的颜色范围,并且可以使用 compA、compB 和 compC 中的公式来控制颜色范围。

因此,对于“秋天”(红黄色)范围使用:

\pgfmathsetmacro\compA{#1/600} %Component R or H
\pgfmathsetmacro\compB{1} %Component G or S
\pgfmathsetmacro\compC{1} %Component B or B

并且,对于“冷色”(青色 - 洋红色)范围,设置 rgb 作为颜色模型并使用:

\pgfmathsetmacro\compA{#1/100}   %Component R or H
\pgfmathsetmacro\compB{1-#1/100} %Component G or S
\pgfmathsetmacro\compC{1}        %Component B or B

对于“黑红”范围使用:

\pgfmathsetmacro\compA{0} %Component R or H
\pgfmathsetmacro\compB{1} %Component G or S
\pgfmathsetmacro\compC{#1/100} %Component B or B

对于“Jet”系列使用:

\pgfmathsetmacro\compA{0.6666-#1/150}      %Component R or H
\pgfmathsetmacro\compB{1} %Component G or S
\pgfmathsetmacro\compC{1}      %Component B or B

对于“Cooper”系列使用:

\pgfmathsetmacro\compA{0.08+#1/5000}      %Component R or H
\pgfmathsetmacro\compB{0.7} %Component G or S
\pgfmathsetmacro\compC{#1/100}      %Component B or B

对于“灰色”范围使用:

\pgfmathsetmacro\compA{0}      %Component R or H
\pgfmathsetmacro\compB{0} %Component G or S
\pgfmathsetmacro\compC{#1/100}      %Component B or B

在此处输入图片描述

答案4

我使用@Unas 答案并进行以下调整以自定义范围,在本例中为 93.6 到 97.2:

\def\cca#1{%
    \pgfmathsetmacro\calc{(#1-93.6)*100/(97.2-93.6)}%
    \edef\clrmacro{\noexpand\cellcolor{blue!\calc}}%
    \clrmacro%
    \ifdim \calc pt>50pt\color{white}\fi{#1}%
}

\edef而不是简单拥有的原因\cellcolor{blue!\calc}是,否则该\calc部分不会扩大。

还请注意%每行末尾的。这可以防止单元格中出现空格

相关内容