如何使用“原始输出”的结果创建平滑的图

如何使用“原始输出”的结果创建平滑的图

正如我之前关于绘制隐式曲线的问题一样,我得到了一些输出。但正如您所见,它并不完全是它应该的样子(当然,除了您的浏览器缩小了 2 倍之外)。

用于重现此问题的代码是(--shell-escape当然,用 运行)

\begin{tikzpicture}[xscale=1,yscale=.25]
  \draw plot[id=curve, raw gnuplot] function{
    f(x,y) = y**2 + (x**2 - 5)*(4*x**4 - 20*x**2 + 25);
    set xrange [-4:4];
    set yrange [-15:15];
    set view 0,0;
    set isosample 1000,1000;
    set size square;
    set cont base;
    set cntrparam levels incre 0,0.1,0;
    unset surface;
    splot f(x,y)
  };
\end{tikzpicture}

我假设gnuplot返回线段端点的坐标,然后由 TikZ 连接它们。但结果并不令人满意,因为gnuplot返回的线段顺序很奇怪。至少,这是我根据图表假设的。现在,由于文档raw gnuplot相当稀疏,并且在互联网上找不到太多这方面的例子,当然没有表面图或隐式函数,我希望有人能给出一些指点(或一个完整的答案,你不会看到我抱怨)。

编辑:正如@Yossi 指出的那样,创建的.table文件gnuplot包含曲线的几个部分,每个部分由 2 条新线分隔。现在 TikZ 连接了这些部分,但实际上不应该。我们快到了 :)。

答案1

根据@Jan 的回答,我进行了修改pgfmoduleplot.code.tex,以便现在为文件中的每个片段生成一个新图。

\pgf@readxyfile现在的完整定义是

\def\pgf@readxyfile{%
  \read1 to \pgf@temp%
  \let\par=\pgf@savedpar%
  \edef\pgf@temp{\pgf@temp}%
  \ifx\pgf@temp\pgfutil@empty%
  \else\ifx\pgf@temp\pgf@partext%
    \pgfplotstreamstart%
    \pgfplotstreamend%
  \else%
    \expandafter\pgf@parsexyline\pgf@temp\pgf@stop%
  \fi\fi%
  \ifeof1\else\expandafter\pgf@readxyfile\fi%
}

这样做的结果是删除了连接线段。唯一的缺点是得到的曲线不相连,在每个方向的 1000 个样本处有一个小间隙,如屏幕截图所示:

替代文本

我不知道这段代码是否会破坏其他任何东西,但它(几乎)解决了我的问题。感谢 Jan 提供的提示!

答案2

我认为如果不修改 pgf,这是不可能的。问题是 pgf.table使用\pgfplotxyfile命令读取 gnuplot 生成的文件,该命令会忽略每行前两个数字以外的所有内容,并忽略空行。您必须进行更改,以便文件中的每个空行.table都会结束当前 plotstream 并开始新的 plotstream。

我想知道仅仅改变 的定义是否足够,或者这是否会破坏其他任何东西。定义新命令并编写新的绘图处理程序(基于 gnuplot 处理程序但用 替换对 的调用)可能\pgfplotxyfile更安全。\pgfplotxyfilewithbreaks\pgfplotxyfile\pgfplotxyfilewithbreaks

相关内容