pgfplots 与 gnuplot:3d 表面/网格图和样本数量问题

pgfplots 与 gnuplot:3d 表面/网格图和样本数量问题

我想通过“gnuplot”绘制给定函数的 3d 曲面/网格。当然,曲面的平滑度取决于样本数量。但在这里我遇到了一个小问题。请看以下示例:

\documentclass{scrartcl}

\usepackage{tikz}
\usepackage{pgfplots}

\pgfplotsset{compat=1.11}

\begin{document} 

\begin{figure}
    \centering

\begin{tikzpicture}
\begin{axis}[
    grid=both,
    view={-45}{90},
    xmin=0,
    xmax=6.28,
    ymin=0,
    ymax=6.28,
    zmin=0,
    zmax=1,
    xlabel=$x$,
    ylabel=$y$,
    ]
    \addplot3[
        mesh,
        draw = black,
        line width = 0.5pt,
        samples = 20,
        samples y = 20,
        raw gnuplot
    ] gnuplot
    {set samples 20,20; set isosamples 20,20 ;splot [0:2*pi] [0:2*pi] cos(x)*cos(y)};
\end{axis}
\end{tikzpicture}

\end{figure}

\end{document}

据我了解,在 gnuplot 中,“set isosamples (ix),(iy)”设置垂直于 x,y 轴的线数,函数在这些线上进行求值。“set samples (x),(y)”设置这些线上(在 x,y 方向上)进行求值的点数。

我的问题是 pgfplots 似乎对这两种样本数(isosamples 和 samples)存在问题。

我已经发现,\addplot3 的“samples”和“samples y”选项因使用“raw gnuplot”而被禁用。所以我想我可以忽略它们。

通过测试,我得出结论,pgfplot 的样本数量由 (x)(“set samples”中的 x 值)和 (iy)(“set isosamples”中的 y 值)决定。(y) 和 (ix) 的值根本不重要。这意味着我基本上可以使用“set samples (x),2”和“set isosamples 2,(iy)”,其中 (x),(iy) 指定我想要的输出样本大小。

我的问题是:

  • 我理解得对吗?有人能证实这一点吗,或者向我解释一下为什么会这样吗?
  • 有没有办法精确重现我从 gnuplot (使用 isosamples 和 samples) 和 pgfplots 获得的输出?我认为这里的主要区别是 pgfplot 使用等距网格,而 gnuplot 则根据线数和这些线上的样本点数进行区分。

答案1

我将尝试在这里阐明一些问题,希望能够有所帮助:

关于samples和,pgfplots 文档第 4 章清楚地解释了这个问题samples y\addplot3

samples 键定义用于线图的样本数量,而 samples y 键用于网格图。

这意味着您需要指定samples y。话虽如此,请注意使用raw gnuplot

禁用示例和域

samples为了澄清 gnuplot中的混淆isosamples,这里有一些视觉线索。请注意,为了排除 pgfplots 的影响,我通过 gnuplot 的命令行生成了这些:

set samples 20,20; set isosamples 20,20 ;splot [0:2*pi] [0:2*pi] cos(x)*cos(y)

在此处输入图片描述


set samples 5,5; set isosamples 20,20 ;splot [0:2*pi] [0:2*pi] cos(x)*cos(y)

在此处输入图片描述


set samples 20,20; set isosamples 20,2 ;splot [0:2*pi] [0:2*pi] cos(x)*cos(y)

在此处输入图片描述


因此,set isosamples确定等值线表面密度。

等值线是由一个表面参数参数化的曲线,而另一个表面参数是固定的。等值线是显示表面的一种简单方法。通过固定表面 s(u,v) 的 u 参数,可以生成形式为 c(v) = s(u0,v) 的等值线,通过固定 v 参数,可以生成形式为 c(u) = s(u,v0) 的等值线。

对于你的第二个问题,恐怕我不确定你的意思到底是什么。使用 gnuplot 命令会使用外部程序 gnuplot 来计算坐标。如果你想得到类似于 gnuplot 的结果,我认为使用raw gnuplot,你就走在了正确的轨道上。

相关内容