![Проблема с фильтром x при попытке отфильтровать точки по значению x](https://rvso.com/image/254703/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0%20%D1%81%20%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%BC%20x%20%D0%BF%D1%80%D0%B8%20%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B5%20%D0%BE%D1%82%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%BF%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20x.png)
Я пытаюсь отфильтровать точки по их значениям x. Данные могут быть из текстового файла в табличном формате или напрямую введены в координатах {...}. Я пробовал использовать x filter/.code, но для данных из текстового файла это кажется нормальным, в то время как тот же код выдает ошибку компиляции, если данные напрямую введены через координаты {...}.
\addplot[scatter, only marks] table[x=xx, y=yy, col sep=comma]{tmp.txt};
% Seems working
против
\addplot[scatter, only marks] coordinates{(0,0) (1,1) (1,1.5) (2,2)};
%|16 error| Missing = inserted for \ifnum. Y ...s] coordinates{(0,0) (1,1) (1,1.5) (2,2)};
Подозреваю, что это может быть проблема с использованием \pgfmathresult в фильтре x, но не уверен, как это исправить. Ниже приведены MWE вместе с ошибкой компиляции. Предполагая, что файл tmp.txt:
xx, yy
0,0
1,1
1,1.5
2,2
А код такой:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[scale=0.8]
\begin{axis}[
x filter/.code= {
\ifnum\pgfmathresult=1
\def\pgfmathresult{}
\fi
}]
% This seems working fine
\addplot[scatter, only marks] table[x=xx, y=yy, col sep=comma]{tmp.txt};
% This cause compilation error, which is
% |16 error| Missing = inserted for \ifnum. Y ...s] coordinates{(0,0) (1,1) (1,1.5) (2,2)};
%\addplot[scatter, only marks] coordinates{(0,0) (1,1) (1,1.5) (2,2)};
\end{axis}
\end{tikzpicture}
\end{document}
решение1
Это потому, что координаты обрабатываются через внутреннее представление с плавающей точкой, которое для меня является клингонским 1.1Y0.e1
(или что-то вроде того), так что вы видите это Y
в сообщении об ошибке. Решение состоит в том, чтобы преобразовать его в обычную десятичную систему.
Также \ifnum
работает только с целыми числами, но pgfmath имеет тенденцию выдавать ошибки 1.0
даже для целых чисел 1
, поэтому лучше сделать сравнение размерностей, чтобы избавиться от сложностей.
\documentclass{article}
\usepackage{pgfplots}
\pgfplotstableread{
xx yy
0 0
1 1
1 1.5
2 2
}\mytable
\begin{document}
\begin{tikzpicture}[scale=0.8]
\begin{axis}
\addplot[scatter, only marks, x filter/.code= {
\ifnum\pgfmathresult=1
\def\pgfmathresult{}
\fi
}] table[x=xx, y=yy]{\mytable};
\addplot+[no marks, x filter/.code={
\pgfkeys{/pgf/fpu,/pgf/number format/.cd,fixed,verbatim}
\pgfmathprintnumberto{\pgfmathresult}{\mytempvar}
\ifdim\mytempvar pt=1pt%
\def\pgfmathresult{}
\fi
}] coordinates{(0,0) (1,1) (1,1.5) (2,2)};
\end{axis}
\end{tikzpicture}
\end{document}