语境:我想用 绘制 CSV 文件中的一些数据pgfplots
。此文件包含的信息比需要的多,所以我想对其进行过滤。过滤器(discard if not
来自这里或者那里) 在一列上运行良好,但当我想同时过滤几列时,我遇到了一些麻烦。
问题:在我的例子中,我想取 3 个“若否则丢弃”条件的交集。但似乎只考虑了最后一个条件。
以下是平均能量损失:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{filecontents}
\begin{filecontents}{data.csv}
# x, y, color, shape, size
1, 3, a, 0, 2
2, 6, b, 0, 2
3, 5, a, 1, 2
4, 4, b, 1, 3
5, 9, a, 0, 3
6, 1, b, 1, 3
\end{filecontents}
\begin{document}
\pgfplotsset{
discard if not A/.style 2 args={
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempaa{#2}
\ifx\tempa\tempaa
\else
\def\pgfmathresult{}
\fi
}
},
discard if not B/.style 2 args={
x filter/.code={
\edef\tempb{\thisrow{#1}}
\edef\tempbb{#2}
\ifx\tempb\tempbb
\else
\def\pgfmathresult{}
\fi
}
},
}
\begin{tikzpicture}
\begin{axis}[grid]
\addplot+[mark=+, only marks,]
table[x expr=\thisrow{x}*1, y expr=\thisrow{y}*1,
discard if not A={color}{a},
discard if not A={shape}{0},
discard if not B={size}{2},
ignore chars={\#}, col sep=comma,
]
{data.csv};
\end{axis}
\end{tikzpicture}
\end{document}
在前面的例子中,我没有只绘制 1 个点,而是得到了与之对应的 3 个点size=2
。
尽管我的问题似乎与此类似问题,这并不相同,因为它不同于一个“丢弃如果”和一个“丢弃如果不是”的组合与三个“丢弃如果不是”的组合。但当然,我尝试使用这个先前的问题来解决我的问题,但没有成功。
问题:如何解决这个问题,并得到这三个discard if not
条件的交集pgfplots
?
答案1
而不是x filter/.code
你想要的x filter/.append code
。那么您只需要一个版本。
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{filecontents}
\begin{filecontents}[overwrite]{data.csv}
# x, y, color, shape, size
1, 3, a, 0, 2
2, 6, b, 0, 2
3, 5, a, 1, 2
4, 4, b, 1, 3
5, 9, a, 0, 3
6, 1, b, 1, 3
\end{filecontents}
\begin{document}
\pgfplotsset{
discard if not A/.style 2 args={
x filter/.append code={
\edef\tempa{\thisrow{#1}}
\edef\tempaa{#2}
\ifx\tempa\tempaa
\else
\def\pgfmathresult{}
\fi
}
}}
\begin{tikzpicture}
\begin{axis}[grid]
\addplot+[mark=+, only marks,]
table[x expr=\thisrow{x}*1, y expr=\thisrow{y}*1,
discard if not A={color}{a},
discard if not A={shape}{0},
discard if not A={size}{2},
ignore chars={\#}, col sep=comma,
]
{data.csv};
\end{axis}
\end{tikzpicture}
\end{document}