仅在 \pgfplotstabletypeset 中显示输入数据文件的最后 N 行

仅在 \pgfplotstabletypeset 中显示输入数据文件的最后 N 行

我想将行限制\pgfplotstabletypeset为最后 N 行。我可以通过以下方式跳过行:

\pgfplotstabletypeset[skip rows between index={0}{4}]{file.data}

但这只有在我提前知道总行数的情况下才有效。由于数据文件会随着时间的推移而增长,我希望表格仅包含最后的行,比如说 12 行。截断数据文件不是一种选择,因为它也用于所有行都相关的 pgfplot 中。

有没有办法skip rows between index根据文件的总行数来计算第二个参数?

答案1

这里有一种名为 的新样式print last,可用于仅打印表格的最后几行。您可以使用参数指定要打印的行数print last(因此print last=3将打印表格的最后三行)。如果您不提供选项,则只会打印最后一行。

该样式使用 来工作row predicate,它允许我们指定为表中的每一行执行的代码块,如果\pgfplotstableuserowfalse在该代码块中执行,则该行将被忽略。在代码执行期间,总行数可用作\pgfplotstablerows

以下是包含该样式的示例:

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{pgfcalendar} % For the date column
\usepackage{filecontents} % To be able to include the data in the .tex file

\begin{filecontents}{testdata.dat}
2011-01-01 5 7.1
2011-02-01 3 8.2
2011-03-01 4 9.1
2011-04-01 2 3.5
2011-05-01 3 9.2
2011-06-01 7 1.1
2011-07-01 7 4.8
2011-08-01 6 2.6
2011-09-01 2 2.7
2011-10-01 5 15.3
2011-11-01 6 4.1
2011-12-01 7 2.2
\end{filecontents}

\begin{document}
%% The interesting bit starts
\pgfkeys{
    /pgfplots/table/print last/.style={
        row predicate/.code={
            % Calculate where to start printing, use `truncatemacro` to get an integer without .0
            \pgfmathtruncatemacro\firstprintedrownumber{\pgfplotstablerows-#1} 
            \ifnum##1<\firstprintedrownumber\relax
                \pgfplotstableuserowfalse
            \fi
        }
    },
    /pgfplots/table/print last/.default=1
}

\pgfplotstabletypeset[
    print last=4,
    columns/0/.style={
        column type=r,
        date type={\monthname\ \year} % Nice date printing
    },
    columns/2/.style={
        dec sep align % Nice number alignment
    }
]{testdata.dat}
\end{document}

相关内容