Crear un mapa de calor utilizando cálculos y un entorno tabular

Crear un mapa de calor utilizando cálculos y un entorno tabular

Sé que existe pgf y mucha gente lo usa para crear mapas de calor. Sin embargo, no puedo utilizar este paquete. Por lo tanto, quiero crear un comando que me permita colorear las diferentes celdas.

encontré estopregunta, que mostró lo siguientedef

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

Pero sólo funciona del 0 al 9 según sus comentarios y mis pruebas.

Quería crear algo más 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}
}

Entonces, ¿básicamente el problema es calcular un número y luego reutilizarlo para definir el color y otros?

Puedo calcular el número usando FP, pero no reutilizarlo dentro de cellcoloro 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}

Básicamente, lo que quiero es crear un mapa de calor, es decir, colorear celdas según el número dentro de la celda en la tabla.

MWE usando código de la solución 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}

Respuesta1

Tu podrías intentar

\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}%
}%

Pero un mwe ayudaría. Ok, mostramos lo que necesitaba, \xdef\respero no sé a qué se dirige. Actualización para explicar que ahora lo entiendo mejor... (Estaba confundido acerca de xcolorla especificación de color con a !porque me hicieron creer que necesitaba un número entre 0 y 1, mientras que se solicita un porcentaje entre 0 y 100).

Se actualizó para evitar la definición de macros \res( \eightyespecialmente \resmolesto porque necesitaba un alcance global; pero podemos usar la capacidad de expansión \xinttheiexpraquí).

\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 también el uso de \textcolor.

cita en bloque

información relacionada