每 N 行加粗最小值

每 N 行加粗最小值

n我想要一种方法来自动(后)处理列中每一行的最小值以粗体显示。

因此,如果我的表格有L行,我想按每组n(假设L % n == 0)对一列进行分组,并将每组的最小值加粗。

伪代码如下:

for i in 0 to (L//n)-1:
    idx = idxmin(row[i*n], row[i*n+1], row[i*n+2], ..., row[i*n+n-1])
    bold(row[idx])

到目前为止我找到的最接近的答案是这个答案将某一列中所有行的最大值加粗,很容易将其修改为将最小值加粗,但我无法超越这一点。

这是一个最小工作示例 ( L==9, n=3)。我希望将列中的第三、第六和第八个值b加粗,而不仅仅是全局最小值(第六个值):

\documentclass[12pt]{article}

\usepackage{pgfplotstable}
\usepackage{booktabs}

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

\pgfplotstableset{
    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\bf}{$}
                    },
                }
            }
        }\setstyles
    }
}

\pgfplotstableread{
a b
1 3.3
2 2.2
3 1.1
4 -101.2
5 -100.3
6 -992.3
7 0.9
8 0.3
9 0.4
}\data

\begin{document}

\begin{table}
\pgfplotstabletypeset[
    columns={a,b},
    highlight col min ={\data}{b},
    every head row/.style={before row=\toprule,after row=\midrule},
    every last row/.style={after row=\bottomrule},
    every nth row={3}{before row=\midrule}
]{\data}
\end{table} % I want 1.1, -992.3, and 0.3 bolded - not just -992.3

\end{document}

电流输出

我发现语法很难理解,我想请教这里的有经验的人。阅读 pgfplotstable 文档并没有帮助我找到解决方案。

答案1

我最终修改了 csv 文件,并根据与相邻行值的相对顺序$(col)rank为每列添加了我想要设置样式的列。我使用了 Julia(来自 DataFrames.jl 和StatsBase.jl),但您可以使用任何您想要的。$colgroupby, transformcompeterank

现在剩下的就是将行中排名列等于 的值加粗1。这是用于突出显示最小值,检查是否等于n(组的长度)以突出显示最大值。

我最终添加了以下列样式(针对 columncol和 rank column colrank)。我更希望在“全局”中定义一个函数/代码段,\pgfplotstabletypeset然后我可以根据需要为每个 (col, colrank) 对、表等调用它。但我无法让它工作。除非重复使用函数,否则此代码片段可以工作,并且非常简洁易读:

\pgfplotstabletypeset[
    ...
    columns/col/.style={
        ...
        postproc cell content/.code={ % snippet start
            \pgfplotstablegetelem{\pgfplotstablerow}{colrank}\of\table
            \ifnum\pgfplotsretval=1\relax
                \pgfkeysalso{@cell content/.add={$\bf}{$}}
            \fi
        }, % snippet end
        ...
    },
    ...
]{\table}

这些答案很有帮助:

相关内容