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 cellcolor
o 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\res
pero no sé a qué se dirige. Actualización para explicar que ahora lo entiendo mejor... (Estaba confundido acerca de xcolor
la 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
( \eighty
especialmente \res
molesto porque necesitaba un alcance global; pero podemos usar la capacidad de expansión \xinttheiexpr
aquí).
\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
.