排除 pgfplotstable 中的每第 n 行

排除 pgfplotstable 中的每第 n 行

我需要从表中排除第 0、3、6...行。\pgfmathparse{Mod(#1, 3) == 0}内部不起作用row predicate/.code={},它出现以下错误:

! Package PGF Math Error: Sorry, the operation 'Mod' has not yet been implemented in the floating point unit :-( (in 'Mod(0, 3) == 0').

我从另一个问题复制了以下 MWE。我想根据行的索引而不是它们的值来排除行。

\documentclass{minimal}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
  num       value
  1         2
  2         5
  1         3
  3         2
  1         4
  2         1
}\data
\pgfplotstabletypeset[row predicate/.code={%
  \ifnum\pgfplotstablegetelem{#1}{num}\of{\data}=1\relax
  \else\pgfplotstableuserowfalse\fi}]{\data}
\end{document}

答案1

如果要过滤每第 n 行,可以使用\pgfmathparse{int(mod(#1,3))}(注意小写m),然后使用\ifnum\pgfmathresult>0\relax来检查是否使用该行:

\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
  num       value
  1         2
  2         5
  1         3
  3         2
  1         4
  2         1
}\data
\pgfplotstabletypeset[row predicate/.code={%
  \pgfplotstablegetelem{#1}{num}\of{\data}
  \pgfmathparse{int(mod(#1,3))}
  \ifnum\pgfmathresult>0\relax
  \else\pgfplotstableuserowfalse\fi}]{\data}
\end{document}


如果您想按价值单元格,如您的代码示例所示,您需要稍微调整代码:

\pgfplotstablegetelem宏不会展开到其返回值;相反,它将返回值写入名为 的宏\pgfplotsretval。如果在条件中使用该宏\ifnum,它将按预期工作:

\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}
\pgfplotstableread{
  num       value
  1         2
  2         5
  1         3
  3         2
  1         4
  2         1
}\data
\pgfplotstabletypeset[row predicate/.code={%
  \pgfplotstablegetelem{#1}{num}\of{\data}
  \ifnum\pgfplotsretval=1\relax
  \else\pgfplotstableuserowfalse\fi}]{\data}
\end{document}

相关内容