我见过有人在使用 pgfplots 绘图之前对导入的数据应用过滤器,请参阅在 pgfplots 中对数据进行分组。有没有办法扩展那里介绍的方法以应用多个过滤器?在下面的 MWE 中,我对那里给出的解决方案进行了简单的修改,但似乎只应用了最后一个过滤器:不需要的 y=1 数据点也被绘制出来了。
\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplots}
\begin{filecontents}{foo.txt}
x y z f
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
\end{filecontents}
\pgfplotsset{
discard if not/.style 2 args={
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\ifx\tempa\tempb
\else
\def\pgfmathresult{nan}
\fi
}}
}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}
\addplot table[x=x, y=f,
discard if not={y}{0},
discard if not={z}{0},
] {foo.txt};
\end{axis}
\end{tikzpicture}
\caption{$f(x)$ given $y=0$ and $z=0$.}
\end{figure}
\end{document}
答案1
当然。您只需要在定义中替换.code
。.append code
第一个“重置”命令并(仅)应用新内容,而后者 - 顾名思义 - 将内容附加到前一个命令。
% used PGFPlots v1.14
\begin{filecontents}{foo.txt}
x y z f
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
\end{filecontents}
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{
discard if not/.style 2 args={
% suppress LOG messages about the filtered points
filter discard warning=false,
x filter/.append code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\ifx\tempa\tempb
\else
\def\pgfmathresult{NaN}
\fi
},
},
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot
table [x=x,y=f] {foo.txt};
\addplot+ [mark=+]
table [
x=x,y=f,
discard if not={y}{0},
discard if not={z}{0},
] {foo.txt};
\end{axis}
\end{tikzpicture}
\end{document}