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