笔记
除了最近的问题(见下文)之外,我还发布了这个问题,并对问题进行了更详细的描述:
最初的问题是这样的: 如何从表中过滤/选择数据并绘制它?
描述
现在,这是具体的问题:我有一个包含数据的表,在执行任何操作之前,我会按其中一列对数据进行排序。然后我想执行以下操作
- 仅过滤包含特定内容的行文本
- 再次过滤,但现在只有包含特定值的行(也可能是漂浮数字或空单元格)
- 将过滤后的数据绘制成表格
- 在图表中绘制包含过滤数据的其中一列作为 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}