在表格中突出显示极值

在表格中突出显示极值

在由 生成的表格中pgfplotstable,如何突出显示每列或每行中具有最小值的单元格(例如以粗体显示相应的条目)?

例子:

例子

答案1

您可以向表格中添加一个包含行号的辅助列,然后使用它\pgfplotstablesort根据指定的列对表格进行排序,然后提取行号列的第一个元素。然后可以将其输入到every row <row> column <col>Christian 在其答案中使用的样式中。

要获取行的极值,您可以先使用转置表\pgfplotstabletranspose{<new macro>}{<existing table>},然后按照之前的方式进行。

\data这是一个自动执行此操作的解决方案。如果您将数据存储在名为using 的表中\pgfplotstableread{...}\data,则可以调用

\pgfplotstabletypeset[
    highlight col max ={\data}{a}, highlight col min ={\data}{a},
    highlight col max ={\data}{b}, highlight col min ={\data}{b},
    highlight col max ={\data}{c}, highlight col min ={\data}{c}
]{\data}

得到以下输出:

\pgfplotstabletypeset[
    highlight row max ={\data}{1}, highlight row min ={\data}{1},
    highlight row max ={\data}{2}, highlight row min ={\data}{2},
    highlight row max ={\data}{3}, highlight row min ={\data}{3}
]{\data}

将产生

在此处输入图片描述

代码如下:

\documentclass{article}
\usepackage{pgfplotstable}

\newcommand{\findmax}[3]{
    \pgfplotstablevertcat{\datatable}{#1}
    \pgfplotstablecreatecol[
    create col/expr={%
    \pgfplotstablerow
    }]{rownumber}\datatable
    \pgfplotstablesort[sort key={#2},sort cmp={float >}]{\sorted}{\datatable}%
    \pgfplotstablegetelem{0}{rownumber}\of{\sorted}%
    \pgfmathtruncatemacro#3{\pgfplotsretval}
    \pgfplotstableclear{\datatable}
}

\newcommand{\findmin}[3]{
    \pgfplotstablevertcat{\datatable}{#1}
    \pgfplotstablecreatecol[
      create col/expr={%
    \pgfplotstablerow
    }]{rownumber}\datatable
    \pgfplotstablesort[sort key={#2},sort cmp={float <}]{\sorted}{\datatable}%
    \pgfplotstablegetelem{0}{rownumber}\of{\sorted}%
    \pgfmathtruncatemacro#3{\pgfplotsretval}
    \pgfplotstableclear{\datatable}
}


\pgfplotstableread{
a b c
0.32 0.22 0.99
1.22 3.21 0.05
4.10 0.32 2.49
}\data


\begin{document}

\pgfplotstableset{
    highlight col max/.code 2 args={
        \findmax{#1}{#2}{\maxval}
        \edef\setstyles{\noexpand\pgfplotstableset{
                every row \maxval\noexpand\space column #2/.style={
                    postproc cell content/.append style={
                        /pgfplots/table/@cell content/.add={$\noexpand\bf}{$}
                    },
                }
            }
        }\setstyles
    },
    highlight col min/.code 2 args={
        \findmin{#1}{#2}{\minval}
        \edef\setstyles{\noexpand\pgfplotstableset{
                every row \minval\noexpand\space column #2/.style={
                    postproc cell content/.append style={
                        /pgfplots/table/@cell content/.add={\noexpand\color{red}$\noexpand\bf}{$}
                    },
                }
            }
        }\setstyles
    },
    highlight row max/.code 2 args={
        \pgfmathtruncatemacro\rowindex{#2-1}
        \pgfplotstabletranspose{\transposed}{#1}
        \findmax{\transposed}{\rowindex}{\maxval}
        \edef\setstyles{\noexpand\pgfplotstableset{
                every row \rowindex\space column \maxval\noexpand/.style={
                    postproc cell content/.append style={
                        /pgfplots/table/@cell content/.add={$\noexpand\bf}{$}
                    },
                }
            }
        }\setstyles
    },
    highlight row min/.code 2 args={
        \pgfmathtruncatemacro\rowindex{#2-1}
        \pgfplotstabletranspose{\transposed}{#1}
        \findmin{\transposed}{\rowindex}{\maxval}
        \edef\setstyles{\noexpand\pgfplotstableset{
                every row \rowindex\space column \maxval\noexpand/.style={
                    postproc cell content/.append style={
                        /pgfplots/table/@cell content/.add={\noexpand\color{red}$\noexpand\bf}{$}
                    },
                }
            }
        }\setstyles
    },
}

\makeatletter
\long\def\pgfplotstabletypeset@opt@collectarg[#1]#2{%

    \pgfplotstable@isloadedtable{#2}%
        {\pgfplotstabletypeset@opt@[#1]{#2}}%
        {\pgfplotstabletypesetfile@opt@[#1]{#2}}%
}
\makeatother


\pgfplotstabletypeset[
    highlight row max ={\data}{1}, highlight row min ={\data}{1},
    highlight row max ={\data}{2}, highlight row min ={\data}{2},
    highlight row max ={\data}{3}, highlight row min ={\data}{3}
]{\data}

\end{document}

答案2

最新版本1.5带有一种every row <rowindex> column <colindex>似乎可以满足您的要求的样式。以下示例取自手册:

\pgfplotstabletypeset[
    every row 1 column 2/.style={/pgf/number format/sci},
    every row 0 column 0/.style={postproc cell content/.style={@cell content=\textbf{##1}}},
    col sep=&,row sep=\\]{
  colA & colB & colC \\
  11   & 12   & 13   \\
  21   & 22   & 23   \\
}

在此处输入图片描述

这里有两个单元格得到特殊处理;一个通过简单选项,另一个通过格式化指令。也许可以将冗长的指令隐藏在一些较小的样式后面,例如

\pgfplotstableset{
    bf content/.style={postproc cell content/.style={@cell content=\textbf{##1}}
}

结合every row 0 column 0/.style={bf content}(但我没有验证过)。

请注意,它也接受列名称而不是指数。

相关内容