在由 生成的表格中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}
(但我没有验证过)。
请注意,它也接受列名称而不是指数。