我想通过“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
,你就走在了正确的轨道上。