使用gnuplot创建数据文件

时间:2015-11-21 20:19:51

标签: vector 3d gnuplot

我是gnuplot的新手。我试图绘制3d矢量字段。我知道我必须创建一个包含六列代表x,y,z,deltax,deltay,deltaz的数据文件。

我想知道是否可以定义函数f(x,y,z)并让gnuplot创建我想要的数据文件以绘制向量。 如果是这样,我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

您可以使用特殊文件名++创建一个2d网格,您可以在其上定义矢量字段:

set xrange [-10:10]
set yrange [-10:10]
set samples 100
set isosamples 100

vx(x,y,z) =  ...
vy(x,y,z) = ...
vz(x,y,z) = ...
z(x,y) = ...

splot '++' using 1:2:(z($1,$2)):(vx($1,$2,z($1,$2))):(vy($1,$2,z($1,$2))):(vz($1,$2,z($1,$2))) with vectors

这会在曲面(vx,vy,vz)上绘制一个矢量场z(x,y)。 Gnuplot无法生成3d网格。

您可以尝试用循环模拟这样一个真正的三维矢量场:

z(i) = -10 + i*(20.0/99.0)
splot for [i=1:100] '++' using 1:2:(z(i)):(vx($1,$2,z(i))):(vy($1,$2,z(i))):(vz($1,$2,z(i))) with vectors lt 1

作为例子考虑以下脚本为中央力量:

lim = 2
N = 6

set xrange [-lim:lim]
set yrange [-lim:lim]
set zrange [-lim:lim]
set samples N
set isosamples N

sc= 0.3
r(x,y,z) = sqrt(x**2 + y**2 + z**2)
gx(x,y,z) = sc/(x**2 + y**2 + z**2) * x/r(x,y,z)
gy(x,y,z) = sc/(x**2 + y**2 + z**2) * y/r(x,y,z)
gz(x,y,z) = sc/(x**2 + y**2 + z**2) * z/r(x,y,z)

z(i) = -lim + 2*i*lim/(N - 1.0)

unset key
set xyplane 0
splot for [i=1:N] '++' using 1:2:(z(i)):(gx($1,$2,z(i))):(gy($1,$2,z(i))):(gz($1,$2,z(i))) with vectors lt 1

输出

(L776)

答案 1 :(得分:1)

这里有一个适用于3d曲面图的答案。我相信这也可以扩展到矢量场 - 也就是编写一个在我的舒适区之外的功能。

您可以将函数绘制到表格而不是图形输出,然后使用刚刚生成的表格绘制图形(并可以在之前检查,编辑等)。样品:

# output to a file with the data
set table "so.dat"

# plot your function
splot [-2:2][-2:2] exp(-(x**2 + y**2))*cos(x/4)*sin(y)*cos(2*(x**2+y**2))

# switch the graphic screen on again and plot from your file
unset table
unset ztics                       # avoiding cluttered ztics
splot "so.dat" u 1:2:3 w l

产量

enter image description here

样本取自Philipp K. Janert,Gnuplot In Action