跳到 pgfplots 中的长行

跳到 pgfplots 中的长行

使用时如何跳过过长的行

\addplot

从 csv 文件读取的命令和数据?我的数据库有大约 500k 个点,描述 xy 空间中的位置。在制作通常的绘图时,位置可能会被环绕(从一个边界转移到另一个边界),从而造成混乱(水平线和垂直线):

缠绕线

我该如何防止这种情况发生?将文件拆分成几个文件不是一个选择,因为我有多个图,其中有许多“传输线”。使用

only marks

也无济于事,因为它在点之间产生了很大的空间:

在此处输入图片描述

答案1

我想到了一个部分解决方案。它只是迭代每一行并将其与前一行进行比较,如果坐标没有回绕,则只绘制它。但是,它不是最快的(实际上,它非常慢)。此外,它还不支持平滑线,所以如果有人知道更好的方法,请分享。

\begin{tikzpicture}
\begin{axis}[
    height=12cm,
    width=12cm,
    xmin=-500,
    xmax=500,
    ymin=-500,
    ymax=500,
]
\pgfplotstableread[col sep=comma]{plots/random_walk_perlin_state.csv}{\mytable};

\pgfplotstablegetrowsof{\mytable};
\pgfmathsetmacro{\rows}{\pgfplotsretval};

\pgfmathsetmacro{\xnlast}{0}
\pgfmathsetmacro{\ynlast}{0}

\pgfmathsetmacro{\xn}{0}
\pgfmathsetmacro{\yn}{0}

\pgfmathsetmacro{\len}{100}

\pgfplotsforeachungrouped \i in {0,1,...,\rows-1}
{
    \pgfplotstablegetelem{\i}{Pos.x}\of{\mytable}
    \pgfmathsetmacro{\xn}{\pgfplotsretval}
    \pgfplotstablegetelem{\i}{Pos.y}\of{\mytable}
    \pgfmathsetmacro{\yn}{\pgfplotsretval}

    \pgfmathparse{ abs(\xnlast-\xn) < \len ? (abs(\ynlast-\yn) < \len ? 1 : 0) : 0}
    \ifthenelse{\pgfmathresult > 0}
    {
        \edef\temp
        {
            \noexpand
            \draw (\xnlast,\ynlast) -- (\xn,\yn);
        }
        \temp
    };

    \pgfmathsetmacro{\xnlast}{\xn}
    \pgfmathsetmacro{\ynlast}{\yn}

};
\end{axis}
\end{tikzpicture} 

相关内容