我正在用 gnuplot “splot” 函数绘制一个 3d 曲面。数据以 (x,y,z) 格式写入文本文件的 3 列中。当我从文件中绘制数据时, splot 连接数据的端点。表面本身是正确的,但在表面底部还有一组额外的不需要的平行线(形成 xy 平面)。所以对于每个 x,它会绘制一个对称衰减到零的函数,但是 +\infty 和 -\infty 也连接在一起!这使得图表下方出现了一个不需要的 x 轴。
我试图将边界设置为零,玩数据格式等。没有运气!
我正在用 gnuplot “splot” 函数绘制一个 3d 曲面。数据以 (x,y,z) 格式写入文本文件的 3 列中。当我从文件中绘制数据时, splot 连接数据的端点。表面本身是正确的,但在表面底部还有一组额外的不需要的平行线(形成 xy 平面)。所以对于每个 x,它会绘制一个对称衰减到零的函数,但是 +\infty 和 -\infty 也连接在一起!这使得图表下方出现了一个不需要的 x 轴。
我试图将边界设置为零,玩数据格式等。没有运气!
您的问题是您的数据不是“网格数据”格式。Gnuplot 看到数据并将其绘制为线而不是将其绘制为表面。不幸的是,我不知道 matlab,但这里有一些应该可以工作的伪代码(尽管可能不是编写数据的最有效方式):
do iy=1 to ny
do ix=1 to nx
write gridx(ix,iy), gridy(ix,iy), data(ix,iy)
enddo
write blank line
enddo
当然,如果您的网格可以表示为一维数组(而不是上面的二维),您可以执行以下操作(使用适当的循环):
write gridx(ix), gridy(iy), data(ix,iy)
或者,您可以dgrid3d
在 gnuplot 中使用。 dgrid3d
将非网格数据插入到网格数据中。默认情况下,它会插入一个 10x10 的网格,正如您所指出的,它非常粗糙。您可以通过set dgrid3d NX,NY
whereNX
和NY
分别增加 x 和 y 轴上的点数。
最后,如果您不想弄乱您的数据文件,您可能需要考虑使用gnuplot FAQ(第 3.9 节)中的以下awk
脚本:
#addblanks.awk
/^[[:blank:]]*#/ {next} # ignore comments (lines starting with #)
NF < 3 {next} # ignore lines which don't have at least 3 columns
$1 != prev {printf "\n"; prev=$1} # print blank line
{print} # print the line
现在绘制你的表面:
set surface
splot "<awk -f addblanks.awk yourdatafile.dat"