Ich weiß, dass es PGF gibt und viele Leute verwenden es, um Heatmaps zu erstellen. Ich darf dieses Paket jedoch nicht verwenden. Ich möchte daher einen Befehl erstellen, mit dem ich die verschiedenen Zellen einfärben kann.
ich habe das gefundenFrage, die folgendes zeigtedef
\def\cca#1{\cellcolor{black!#10}\ifnum #1>5\color{white}\fi{#1}}
Aber gemäß seinen Kommentaren und meinen Tests funktioniert es nur von 0-9.
Ich wollte etwas Allgemeineres erstellen, etwa diesen Pseudocode:
\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}
}
Es geht also grundsätzlich darum, eine Zahl zu berechnen und diese dann zur Definition von Farbe und anderem wiederzuverwenden?
cellcolor
Ich kann die Zahl mit FP berechnen, aber nicht innerhalb von oder wiederverwenden 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}
Im Grunde möchte ich eine Heatmap erstellen, also Zellen auf Grundlage der Zahl innerhalb der Zelle in der Tabelle einfärben.
MWE verwendet Code aus Lösung 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}
Antwort1
Du könntest es versuchen
\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}%
}%
Aber ein MWE würde helfen. Ok, MWE hat gezeigt, dass ich es brauche, \xdef\res
aber ich bin ziemlich im Dunkeln, was das Ziel ist. Update zur Erklärung, jetzt verstehe ich es besser ... (Ich war verwirrt über die xcolor
Farbspezifikation mit einem, !
da ich glauben gemacht wurde, dass eine Zahl zwischen 0 und 1 erforderlich ist, während ein Prozentsatz zwischen 0 und 100 verlangt wird).
Aktualisiert, um das Definieren von Makros zu vermeiden \res
und \eighty
(war besonders \res
ärgerlich, da es einen globalen Bereich benötigte; aber wir können hier die Erweiterbarkeit nutzen \xinttheiexpr
).
\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}
Beachten Sie auch die Verwendung von \textcolor
.