我是gnuplot的新手。我试图绘制3d矢量字段。我知道我必须创建一个包含六列代表x,y,z,deltax,deltay,deltaz的数据文件。
我想知道是否可以定义函数f(x,y,z)并让gnuplot创建我想要的数据文件以绘制向量。 如果是这样,我该怎么做呢?
答案 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
输出
答案 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
产量
样本取自Philipp K. Janert,Gnuplot In Action