
Я хочу отфильтровать некоторые данные для графика, и пока лучшее, что я нашел, этоэто здесь.
Это соответствующий код из упомянутого вопроса:
\pgfplotsset{
discard if not and smaller/.style n args={4}{
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\edef\tempc{\thisrow{#3}}
\edef\tempd{#4}
\ifnum\tempa=\tempb
\ifnum\tempc<\tempd
\def\pgfmathresult{inf}
\else
\fi
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\begin{tikzpicture}
\begin{axis}
\addplot [ultra thick,
black,
discard if not and smaller={P}{0}{X}{5}] table [x=X, y=Y] {data.dat};
\end{tikzpicture}
Насколько я вижу, условные операторы с \ifnum
работают только с целыми числами. Поэтому я попытался заменить его на dimension, так как мне нужны числа с плавающей точкой. И я хочу проверить неравенство (т.е. данные должны лежать в определенном диапазоне)
\pgfplotsset{
discard if out of range/.style n args={3}{
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\edef\tempc{#3}
\ifdim\tempa pt> \tempb pt
\ifdim\tempa pt< \tempc pt
\else
\def\pgfmathresult{inf}
\fi
\else
\def\pgfmathresult{inf}
\fi
}
}
}
Однако я всегда получаю ошибку: Missing number, treated as zero.
в строке использования \addplot
новой опции. Я думаю, что это может быть связано с тем, как Tex и pgfplots оценивают выражение, \thisrow{#1}
но я понятия не имею, как это выяснить...
Наконец, полный пример:
\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable,filecontents}
\begin{filecontents}{file.dat}
x y z
0 1 2
2 3 3.5
3 4 5
\end{filecontents}
\pgfplotsset{
discard if out of range/.style n args={3}{
x filter/.code={
\edef\tempa{\thisrow{#1}}
\edef\tempb{#2}
\edef\tempc{#3}
\ifdim\tempa pt> \tempb pt
\ifdim\tempa pt< \tempc pt
\else
\def\pgfmathresult{inf}
\fi
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[unbounded coords=discard ,filter discard warning=false,]
\pgfplotstableread{file.dat}\datatable
\addplot[scatter,point meta=explicit,] table [
meta = z,
discard if out of range={x}{0.5}{4},
] from \datatable {};
\end{axis}
\end{tikzpicture}
\end{document}
решение1
Если вы просто хотите отфильтровать значения в закрытом диапазоне, то вам следует использовать ключ, restrict x to domain=<min>:<max>
как уже упоминалось вкомментарий к вопросу.
Вот реальный MWE, использующий эту функцию из предоставленного вами кода.
\begin{filecontents}{file.dat}
x y z
0 1 2
2 3 3.5
3 4 5
\end{filecontents}
\documentclass[border=2mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\pgfplotstableread{file.dat}\datatable
% without restricting the domain
\addplot+ [very thick] table {\datatable};
% with restricting the domain
\addplot table [
restrict x to domain=0.5:4,
] {\datatable};
\end{axis}
\end{tikzpicture}
\end{document}