pgfplottable 中的“字符串类型”格式列问题

pgfplottable 中的“字符串类型”格式列问题

使用pgfplotstable库从包含数字和字母数字值的数据文件中定义表时,在编译这个简短的 MWE 示例时出现此错误“!包 PGF 数学错误:无法将输入‘B’解析为浮点数”。不明白这个例子有什么问题。

\documentclass{article}
%
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots,pgfplotstable,makecell,booktabs}
\begin{document}
    \begin{table}
      \pgfplotstabletypeset[%
    columns/0/.style={column name=\makecell{Col1\\{}},
        string type},
    columns/1/.style={column name=\makecell{Col2\\{}},
        column type=r,fixed},
    columns/2/.style={column name=\makecell{$GD$\\{}},
        column type=r,sci,zerofill},
    columns/3/.style={column name=\makecell{$\Delta$\\{}},
        column type=r,sci,zerofill},
    every head row/.style={
        before row={\toprule}, % have a rule at top
        after row={\midrule} % rule under units
    },
    skip first n=1
    ]
    {test_data.txt} % filename/path to file
   \end{table}
\end{document}

test_data.txt文件是:

Iter X Y Z
A 12.2 13.4 14.5
B 114.5 345.6 456.5
C 45 5 5

答案1

skip first n意味着跳过数据文件的第一行,但由于第一列包含非数字条目,因此 A 行被读取为带有列名的标题行。当您有一个包含列名的表时,您不能在设置列样式时使用列索引,即columns/<integer>/.style。手册中说:

如果您的表没有列名,您可以简单地使用整数索引而不是<column name>引用列。如果您有列名,则无法使用索引设置列样式

因为你有列名,column/0/.style会影响列姓名 0, 和不是索引0。没有这样的列,因此第一列没有得到键string type,并且B在那里找到的被解析为数字。但事实并非如此。

可能的修复:

  • 添加header=false。这意味着 A 行将不会被解析为标题行,并且您可以使用索引来引用列。
  • 删除skip first n=1,并使用Iter、、XYZ即从第一行读取的列名)代替整数索引。
  • 删除skip first n=1并改用display columns/<integer index>/.style。(显示列作用于输出列而不是输入列。)

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc} 
\usepackage{pgfplotstable,makecell,booktabs}
\begin{document}

      \pgfplotstabletypeset[%
    columns/0/.style={column name=\makecell{Col1\\{}},
        string type},
    columns/1/.style={column name=\makecell{Col2\\{}},
        column type=r,fixed},
    columns/2/.style={column name=\makecell{$GD$\\{}},
        column type=r,sci,zerofill},
    columns/3/.style={column name=\makecell{$\Delta$\\{}},
        column type=r,sci,zerofill},
    every head row/.style={
        before row={\toprule}, % have a rule at top
        after row={\midrule} % rule under units
    },
    every last row/.style={after row=\bottomrule},
    header=false, % <---- add this
    skip first n=1
    ]
    {test_data.txt} 

\bigskip

      \pgfplotstabletypeset[%
    columns/Iter/.style={column name=\makecell{Col1\\{}}, % <-- Iter
        string type},
    columns/X/.style={column name=\makecell{Col2\\{}}, % <-- X
        column type=r,fixed},
    columns/Y/.style={column name=\makecell{$GD$\\{}}, % <-- Y
        column type=r,sci,zerofill},
    columns/Z/.style={column name=\makecell{$\Delta$\\{}}, % <-- Z
        column type=r,sci,zerofill},
    every head row/.style={
        before row={\toprule}, % have a rule at top
        after row={\midrule} % rule under units
    },
    every last row/.style={after row=\bottomrule}
%    skip first n=1 % <-- remove
    ]
    {test_data.txt} 

\bigskip


      \pgfplotstabletypeset[%
    display columns/0/.style={column name=\makecell{Col1\\{}}, % <-- display columns
        string type},
    display columns/1/.style={column name=\makecell{Col2\\{}}, % <-- display columns
        column type=r,fixed},
    display columns/2/.style={column name=\makecell{$GD$\\{}}, % <-- display columns
        column type=r,sci,zerofill},
    display columns/3/.style={column name=\makecell{$\Delta$\\{}}, % <-- display columns
        column type=r,sci,zerofill},
    every head row/.style={
        before row={\toprule}, % have a rule at top
        after row={\midrule} % rule under units
    },
    every last row/.style={after row=\bottomrule}
    %skip first n=1 % <-- remove
    ]
    {test_data.txt} % filename/path to file

\end{document}

相关内容