如何从表中过滤/选择数据(浮点数、文本)并绘制它?

如何从表中过滤/选择数据(浮点数、文本)并绘制它?

笔记

除了最近的问题(见下文)之外,我还发布了这个问题,并对问题进行了更详细的描述:

最初的问题是这样的: 如何从表中过滤/选择数据并绘制它?

描述

现在,这是具体的问题:我有一个包含数据的表,在执行任何操作之前,我会按其中一列对数据进行排序。然后我想执行以下操作

  • 仅过滤包含特定内容的行文本
  • 再次过滤,但现在只有包含特定值的行(也可能是漂浮数字或空单元格
  • 将过滤后的数据绘制成表格
  • 在图表中绘制包含过滤数据的其中一列作为 x,另一列作为 y。

这是我的表格和对其进行排序的代码的示例:

\documentclass{minimal}
\usepackage{pgfplotstable} 
\usepackage{pgfplots}   

\begin{document}
%table with data, empty cells contain 'nan'
\pgfplotstableread{
L   C   T   D   V
A   0   20  1.00346 205
A   0   23  1.00118 177
A   0   25  0.99964 155
A   0   30  0.99579 115
A   0   40  0.98807 69.5
A   9.2 20  0.98444 nan
A   9.2 30  0.97664 66
A   9.2 40  0.96862 43
A   30  20  0.96936 nan
A   30  23  0.96622 16.1
A   30  30  0.964   15.3
B   0   20  1.05104 535
B   0   23  1.04876 439
B   0   25  1.0472  373
B   0   30  1.04327 234
B   0   40  1.03555 115
B   9.6 20  1.02981 nan
B   9.6 23  1.02749 152
B   9.6 25  1.0259  134
}\data

\pgfplotstablesort[sort key={T}]{\sorted}{\data} %get the data and sort by column 'T'

\end{document}    

现在我想筛选第一列大号选择所需的样本。然后我想再次过滤其余数据按列C获得所需的属性。在我最近发布的问题这成为一个问题,因为我过度简化了这个问题,因为列是否包含文本、整数或浮点值很重要。

生成的用于使用浮点值过滤一列的代码(此处:列C)绘制的图表如下所示:

\begin{tikzpicture}
    \begin{axis}[
     xlabel=T,
     ylabel=D,
    x filter/.code={\pgfplotstablegetelem{\coordindex}{C}\of{\sorted}
                    \pgfmathtruncatemacro{\tempva}{abs(\pgfplotsretval - 9.2) == 0 ? 1: 0}
                    \ifnum\tempva>0%true
                    \else%false
                    \def\pgfmathresult{}
                    \fi
                   },
    ]
   \addplot[only marks] table[x=T,y=C] {\sorted};
   \end{axis}
   \end{tikzpicture}

笔记:在我最初的问题中,我删除了第一列大号简化问题,因为它包含text

所以现在,排序工作正常,但过滤似乎是我的问题。

问题是:我如何设置 2 个过滤器并最终将剩余数据绘制为表格以获得整体概览,然后通过选择包含数据的所需列来绘制图表。

答案1

我已经使用了xstring文本比较包,如果数字固定,也可以用于比较数字。

编辑添加了缺失的表格排版部分。过滤了表格的 B-9.6 条目和绘图的 A-9.2 条目

\documentclass{article}
\usepackage{pgfplotstable,xstring} 

\begin{document}
\pgfplotstableread{
L   C   T   D   V
A   0   20  1.00346 205
A   0   23  1.00118 177
A   0   25  0.99964 155
A   0   30  0.99579 115
A   0   40  0.98807 69.5
A   9.2 20  0.98444 nan
A   9.2 30  0.97664 66
A   9.2 40  0.96862 43
A   30  20  0.96936 nan
A   30  23  0.96622 16.1
A   30  30  0.964   15.3
B   0   20  1.05104 535
B   0   23  1.04876 439
B   0   25  1.0472  373
B   0   30  1.04327 234
B   0   40  1.03555 115
B   9.6 20  1.02981 nan
B   9.6 23  1.02749 152
B   9.6 25  1.0259  134
}\data
\pgfplotstablesort[sort key={T}]{\sorted}{\data} %get the data and sort by column 'T'

\pgfplotstabletypeset[row predicate/.code={%
                    \pgfplotstablegetelem{#1}{L}\of{\sorted}
                    \IfStrEq{\pgfplotsretval}{B}{%TRUE
                    \pgfplotstablegetelem{#1}{C}\of{\sorted}
                    \pgfmathtruncatemacro{\tempva}{abs(\pgfplotsretval - 9.6) == 0 ? 1: 0}
                    \ifnum\tempva>0%true
                    \else%false
                    \pgfplotstableuserowfalse
                    \fi}
                    {%FALSE
                    \pgfplotstableuserowfalse
                    } 
},
columns/L/.style={string type}
] {\sorted}

%
   \begin{tikzpicture}
    \begin{axis}[
     xlabel=D,
     ylabel=V,
    x filter/.code={\pgfplotstablegetelem{\coordindex}{L}\of{\sorted}
                     \IfStrEq{\pgfplotsretval}{A}{
                    \pgfplotstablegetelem{\coordindex}{C}\of{\sorted}
                    \pgfmathtruncatemacro{\tempva}{abs(\pgfplotsretval - 9.2) == 0 ? 1: 0}
                    \ifnum\tempva>0%true
                    \else%false
                    \def\pgfmathresult{}
                    \fi}
                    {
                    \def\pgfmathresult{}
                    }
                   },
    x tick label style={/pgf/number format/precision=3}
    ]
   \addplot[only marks] table[x=D,y=V] {\sorted};
   \end{axis}
   \end{tikzpicture}
   \end{document}

在此处输入图片描述

相关内容