pgfplots 根据行值的虚拟列

pgfplots 根据行值的虚拟列

我目前正在使用该pgfplots包从文件渲染表格.csv。文件是自动生成的。

我经常使用如下表格:

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}


\makeatletter
\pgfplotstableset{
    discardrow if not/.style 2 args={
        row predicate/.code={
            \def\pgfplotstable@loc@TMPd{\pgfplotstablegetelem{##1}{#1}\of}
            \expandafter\pgfplotstable@loc@TMPd\pgfplotstablename
            \edef\tempa{\pgfplotsretval}
            \edef\tempb{#2}
            \ifx\tempa\tempb
            \else
                \pgfplotstableuserowfalse
            \fi
        }
    }
}
\makeatother


\usepackage{filecontents}
\begin{filecontents}{data.txt}
 Category  Value    Score
 A   2    1.1
 A   10   2.2
 A   20   1.1 
 A   30   4.2
 A   40   4.6
 B   2    1.2
 B   10   1.1
 B   20   1.1
 B   30   1.2 
 B   40   1.1
\end{filecontents}

\pgfplotstableread{data.txt}\loadedtable

\begin{document}
\pgfplotstabletypeset[columns={Value, Score},
                 columns/Category/.style={string type},
                  discardrow if not={Category}{A}]\loadedtable
                 
\pgfplotstabletypeset[columns={Value, Score},
                 columns/Category/.style={string type},
                  discardrow if not={Category}{B}]\loadedtable
  
\end{document}

现在我想合并这两个表的“类别”行并引入虚拟列,即生成的表应该只包含:

Value Score A Score B
2        1.1   1.2
10       2.2   1.2
20       1.1   1.1
30       4.2   1.2
40       4.6   1.1

我们可以用 来做那件事pgfplots吗?

谢谢您的任何建议!

答案1

为了避免出现虚假空格,请记住在 的定义内%标有 的行末尾添加符号。<----\pgfplotstableset

在此处输入图片描述

\begin{filecontents}[overwrite]{data.txt}
 Category  Value    Score
 A   2    1.1
 A   10   2.2
 A   20   1.1 
 A   30   4.2
 A   40   4.6
 B   2    1.2
 B   10   1.1
 B   20   1.1
 B   30   1.2 
 B   40   1.1
\end{filecontents}

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\makeatletter
\pgfplotstableset{
 discardrow if not/.style 2 args={
  row predicate/.code={%  <-----
   \def\pgfplotstable@loc@TMPd{\pgfplotstablegetelem{##1}{#1}\of}%  <-----
   \expandafter\pgfplotstable@loc@TMPd\pgfplotstablename%  <-----
   \edef\tempa{\pgfplotsretval}%  <-----
   \edef\tempb{#2}%  <-----
   \ifx\tempa\tempb
   \else
   \pgfplotstableuserowfalse
   \fi
  }
 }
}
\makeatother

\pgfplotstableread{data.txt}\loadedtable

\begin{document}
 
 \pgfplotstabletypeset[columns={Value, Score},
 columns/Score/.style={column name=Score A},
 discardrow if not={Category}{A}
 ]\loadedtable
 % <- Add this or remove the line
 \pgfplotstabletypeset[columns={Score},
 columns/Score/.style={column name=Score B},
 discardrow if not={Category}{B}
 ]\loadedtable
 
\end{document}

或者,这会产生相同的结果,但不使用 usgin \pgfplotstableset

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\pgfplotstableread{data.txt}\loadedtable

\begin{document}

\pgfplotstabletypeset[columns={Value, Score},
columns/Score/.style={column name=Score A},
skip rows between index={5}{10},
]\loadedtable
% <- Add this or remove the line
\pgfplotstabletypeset[columns={Score},
columns/Score/.style={column name=Score B},
skip rows between index={0}{5},
]\loadedtable

\end{document}

相关内容