계산 및 테이블 형식 환경을 사용하여 히트맵 만들기

계산 및 테이블 형식 환경을 사용하여 히트맵 만들기

나는 pgf가 존재한다는 것을 알고 있으며 많은 사람들이 이것을 사용하여 히트맵을 만듭니다. 그러나 나는 이 패키지를 사용할 수 없습니다. 따라서 다른 셀에 색상을 지정할 수 있는 명령을 만들고 싶습니다.

나는 이것을 찾았다질문, 이는 다음을 보여주었습니다.def

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

하지만 그의 의견과 내 테스트에 따르면 0-9에서만 작동합니다.

나는 다음 의사 코드와 같이 좀 더 일반적인 것을 만들고 싶었습니다.

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

그렇다면 기본적으로 문제는 숫자를 계산한 다음 이를 재사용하여 색상 등을 정의하는 것입니다.

FP를 사용하여 숫자를 계산할 수 있지만 또는 내에서 재사용할 수는 cellcolor없습니다 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}

기본적으로 내가 원하는 것은 히트맵을 만드는 것입니다. 즉, 테이블의 셀 안에 있는 숫자를 기준으로 셀에 색상을 지정하는 것입니다.

솔루션 1의 코드를 사용하는 MWE

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

답변1

당신은 시도해 볼 수 있습니다

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

하지만 mwe가 도움이 될 것입니다. 좋아, 내가 필요하다는 것을 보여줬 \xdef\res지만 목표가 무엇인지에 대해서는 꽤 어둠 속에 있습니다. 이제 더 잘 이해할 수 있도록 업데이트하세요... ( 0과 1 사이의 숫자가 필요하고 0과 100 사이의 백분율이 필요하다고 믿었기 때문에 xcolor색상 사양 에 대해 혼란스러웠습니다.)!

매크로 정의를 피하기 위해 업데이트되었습니다 \res. \eighty(특히 \res전역 범위가 필요했기 때문에 짜증났지만 여기에서는 확장성을 사용할 수 있습니다 \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}

의 사용에도 주목하세요 \textcolor.

인용구

관련 정보