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 cellcolor
ou 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\res
mas não tenho certeza do que se pretende. Atualização para explicar, entendo melhor agora... (fiquei confuso sobre xcolor
a 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 \res
e \eighty
(especialmente \res
irritante porque precisava de um escopo global; mas podemos usar a capacidade de expansão \xinttheiexpr
aqui).
\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
.