在 addplot 中过滤多行

在 addplot 中过滤多行

下列的这个答案,可以从 csv 文件中过滤一行,例如:

\documentclass{article}

\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{pgfplotstable}

\begin{filecontents*}{mycsvfile.csv}
levels,11,22,33,44,55,66,77,88,99
0,11.0,22.0,33.0,44.0,55.0,66.0,77.0,88.0,99.0
1,11.1,22.1,33.1,44.1,55.1,66.1,77.1,88.1,99.1
2,11.2,22.2,33.2,44.2,55.2,66.2,77.2,88.2,99.2
3,11.3,22.3,33.3,44.3,55.3,66.3,77.3,88.3,99.3
4,11.4,22.4,33.4,44.4,55.4,66.4,77.4,88.4,99.4
5,11.5,22.5,33.5,44.5,55.5,66.5,77.5,88.5,99.5
\end{filecontents*}

\begin{document}
    
\pgfplotsset{
    discard if/.style 2 args={
        x filter/.append code={
            \ifdim\thisrow{#1} pt=#2pt
            \def\pgfmathresult{inf}
            \fi
        }
    },
}

\begin{tikzpicture}
    \begin{axis}[title={Example},]
        \addplot[discard if={levels}{1}, mark=x, style=dashed] table[x=levels, y=55, col sep=comma]{mycsvfile.csv};
    \end{axis}
\end{tikzpicture}
    
\end{document}

我想将此功能扩展为discard if in={levels}{1,3,5}同时过滤第 1、3 和 5 行;即传递一个列表而不是单个值。我显然可以在此特定示例中做到这一点,但我的目标是为任何大小的列表\addplot[discard if ={levels}{1}, discard if ={levels}{3}, discard if ={levels}{5}]创建一个通用功能。discard if in

有什么办法可以做到这一点?


后续问题:

非常感谢 Steven他的回答对上述问题。

我已成功创建discard if not in以下功能:

discard if not in/.style 2 args={
    x filter/.append code={
        \readlist\mylist{#2}%
        \providecommand{\foundit}{0}
        \renewcommand{\foundit}{0}
        \foreachitem\z\in\mylist[]{%
            \ifdim\thisrow{#1} pt=\z pt
            \renewcommand{\foundit}{1}
            \else               
            \fi
        }
        \pgfmathparse{\foundit == 1? \pgfmathresult : nan}
    }
},

这看起来有点复杂,可能存在更优雅的解决方案。我欢迎对此提出任何反馈。

答案1

为此,我使用该listofitems包来消化为级别排除参数提供的逗号分隔列表#2。然后,我设置了一个\foreachitem循环来排除图中的每一个级别。以下是如何在中完成此操作的\pgfplotset

    x filter/.append code={
        \readlist\mylist{#2}%
        \foreachitem\z\in\mylist[]{%
          \ifdim\thisrow{#1} pt=\z pt
          \def\pgfmathresult{inf}
          \fi
        }
    }

下面是 MWE,其中排除了级别 1、3 和 4,其中使用的语法是discard if={levels}{1,3,4}

\documentclass{article}

\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{pgfplotstable}
\usepackage{listofitems}

\begin{filecontents*}{mycsvfile.csv}
levels,11,22,33,44,55,66,77,88,99
0,11.0,22.0,33.0,44.0,55.0,66.0,77.0,88.0,99.0
1,11.1,22.1,33.1,44.1,55.1,66.1,77.1,88.1,99.1
2,11.2,22.2,33.2,44.2,55.2,66.2,77.2,88.2,99.2
3,11.3,22.3,33.3,44.3,55.3,66.3,77.3,88.3,99.3
4,11.4,22.4,33.4,44.4,55.4,66.4,77.4,88.4,99.4
5,11.5,22.5,33.5,44.5,55.5,66.5,77.5,88.5,99.5
\end{filecontents*}

\begin{document}
    
\pgfplotsset{
    discard if/.style 2 args={
        x filter/.append code={
            \readlist\mylist{#2}%
            \foreachitem\z\in\mylist[]{%
              \ifdim\thisrow{#1} pt=\z pt
              \def\pgfmathresult{inf}
              \fi
            }
        }
    },
}

\begin{tikzpicture}
    \begin{axis}[title={Example},]
        \addplot[discard if={levels}{1,3,4}, mark=x, style=dashed] table[x=levels, y=55, col sep=comma]{mycsvfile.csv};
    \end{axis}
\end{tikzpicture}
    
\end{document}

在此处输入图片描述

相关内容