应用多个过滤器来绘制数据

应用多个过滤器来绘制数据

我见过有人在使用 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}

该图显示了上述代码的结果

相关内容