尝试根据 x 值过滤点时,x 过滤器出现问题

尝试根据 x 值过滤点时,x 过滤器出现问题

我正在尝试根据 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)};

我怀疑可能是我在 x 过滤器中对 \pgfmathresult 的使用存在问题,但不确定如何修复。以下是 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}

在此处输入图片描述

相关内容