Criando um mapa de calor usando cálculos e ambiente tabular

Criando um mapa de calor usando cálculos e ambiente tabular

Eu sei que existe pgf, e muitas pessoas usam isso para criar mapas de calor. No entanto, não tenho permissão para usar este pacote. Portanto, quero criar um comando que me permita colorir as diferentes células.

Eu achei istopergunta, que mostrou o seguintedef

\def\cca#1{\cellcolor{black!#10}\ifnum #1>5\color{white}\fi{#1}}

Mas só funciona de 0 a 9, de acordo com seus comentários e meus testes.

Eu queria criar algo mais genérico como este pseudocódigo:

\newcommand{\cTab}[2]
{
    \res = #1/#2 %maybe using FP (?)
    \eighty = 0.8*#2 %maybe using FP (?)

    \cellcolor{black!\res} 
    \ifnum #1>\eighty 
       \color{white}
    \fi{#1}
}

Então basicamente a questão é calcular um número e depois reutilizá-lo para definir cores e outros?

Posso calcular o número usando FP, mas não reutilizá-lo em cellcolorou ifnum.

MWE

\documentclass[letterpaper, 10 pt]{article}

% Color
\usepackage{xcolor,colortbl}%

\begin{document}
\begin{table}[!ht]
\centering
\caption{True data classification.}
\label{tab:CollectedErrors}
\begin{tabular}{|p{1.5cm}|p{0.5cm}|}
\hline
\textbf{Exposure}& \textbf{Attribute} \\ \hline

  4 & 2 \\ \hline
   11 &144 \\ \hline 
\end{tabular}
\end{table}
\end{document}

Basicamente o que eu quero é criar um mapa de calor, ou seja, colorir células com base no número dentro da célula da tabela.

MWE usando código da solução 1

\documentclass[letterpaper, 10 pt]{article}

% Color
\usepackage{xcolor,colortbl}%
\usepackage{xintexpr}

\newcommand{\cTab}[2]
{%
    \edef\res    {\xinttheiexpr [2] #1/#2\relax}% [2] = "two digits after ."
    \edef\eighty {\xinttheiexpr [2] 0.8*#2\relax}%
    \cellcolor{black!\res}%
    \xintifboolexpr {#1>\eighty}
        % yes branch 
           {\color{white}}
        % no branch (nothing to do)
           {}% 
    {#1}%
}%

\begin{document}
\begin{table}[!ht]
\centering
\caption{True data classification.}
\label{tab:CollectedErrors}
\begin{tabular}{|p{1.5cm}|p{0.5cm}|}
\hline
\textbf{Exposure}& \textbf{Attribute} \\ \hline

  \cTab{4}{4} & 2 \\ \hline %example, could also be \cTab{4}{144}, in theory all cells should be changed to cTab
   11 &144 \\ \hline 
\end{tabular}
\end{table}
\end{document}

Responder1

Você poderia tentar

\usepackage{xintexpr}

\newcommand{\cTab}[2]
{%
    \edef\res    {\xinttheiexpr [2] #1/#2\relax}% [2] = "two digits after ."
    \edef\eighty {\xinttheiexpr [2] 0.8*#2\relax}%
    \cellcolor{black!\res}%
    \xintifboolexpr {#1>\eighty}
    % yes branch 
       {\color{white}}
    % no branch (nothing to do)
       {}% 
    {#1}%
}%

Mas um mwe ajudaria. Ok, mostramos que precisava, \xdef\resmas não tenho certeza do que se pretende. Atualização para explicar, entendo melhor agora... (fiquei confuso sobre xcolora especificação de cores com a, !pois fui levado a acreditar que precisava de um número entre 0 e 1, enquanto uma porcentagem entre 0 e 100 é solicitada).

Atualizado para evitar a definição de macros \rese \eighty(especialmente \resirritante porque precisava de um escopo global; mas podemos usar a capacidade de expansão \xinttheiexpraqui).

\documentclass[letterpaper, 10 pt]{article}

% Color
\usepackage{xcolor,colortbl}

% Fine stuff
\usepackage{xintexpr, xinttools}

\newcommand{\cTab}[2]% #1 = cell, #2 = max
{%
    \cellcolor{black!\xinttheiexpr 100*#1/#2\relax}%
    \xintifboolexpr {#1>0.8*#2}%
    % "yes" branch 
       {\textcolor{blue}{#1}}% when #1 is big, print it blue
    % "no" branch
       {#1}% 
}%

\begin{document}
\begin{table}[!ht]
\centering
\caption{True data classification.}
\label{tab:CollectedErrors}
\smallskip
\begin{tabular}{|p{1.5cm}|c|}
\hline
\textbf{Exposure}& \textbf{Attribute} \\ \hline
\xintFor* #1 in {\xintSeq[3]{1}{100}}\do
{%
  \cTab{#1}{100} & \cTab{\the\numexpr100-#1\relax}{100}\\
}
\hline 
\end{tabular}
\end{table}
\end{document}

Observe também o uso de \textcolor.

Bloco de citação

informação relacionada