Gnuplot 线条上的箭头

Gnuplot 线条上的箭头,gnuplot,Gnuplot,我具有电场线的功能: set isosamples 55, 55 set contour base set cntrparam levels incremental -1.6,0.2,1.6 unset surface splot [-4:4] [-2.2:2.2] (y*(1+1/(x**2 + y**2))) 如何在该曲线上放置箭头,sey位于x=2的位置? 实现这一目标的一种方法如下: set isosamples 200, 200 set contour base unset su

我具有电场线的功能:

set isosamples 55, 55
set contour base
set cntrparam levels incremental -1.6,0.2,1.6
unset  surface
splot [-4:4] [-2.2:2.2] (y*(1+1/(x**2 + y**2)))
如何在该曲线上放置箭头,sey位于x=2的位置?
实现这一目标的一种方法如下:

set isosamples 200, 200
set contour base
unset  surface
set cntrparam levels incremental -2,0.2,2

set xr [-4:4]
set yr [-3:3]

x_ref = 2

f(x,y) = (y*(1+1/(x**2 + y**2)))
g(x,y) = 2*x*y / ( (x*x + y*y)**2 + (x*x + y*y) - 2*y*y )

set table 'meta.levels.dat'
splot f(x, y)

set table 'meta.pnts.dat'
splot f(x_ref, y)

unset key
unset table
set terminal pngcairo enhanced size 600, 400
set output 'fig.png'

set style arrow 1 head filled size screen 0.01,30 fixed lc rgb 'dark-red'

set size ratio -1

delta = 0.01

plot \
    'meta.levels.dat' w l lc rgb 'black', \
    'meta.pnts.dat' every 1:1:0:0:0:0 u (x_ref-delta):($2-g(x_ref,$2)*delta):(delta):(g(x_ref,$2)*delta) with vectors as 1
策略是:

  • 首先生成感兴趣函数的轮廓(
    f(x,y)
    ,在上面的脚本中),并通过
    set table
  • 对于选择的
    x
    (例如
    x\u ref=2
    ),生成
    f(x\u ref,y)
    的轮廓。由于此功能不依赖于
    x
    ,因此生成的轮廓将只是与
    x-
    轴平行的直线,因此为了绘制与
    f(x,y)
    轮廓的交点,可以只取每个块(每个轮廓)的第一个点并用
    x
    -坐标设置为
    x\u ref
    进行绘图
  • 使用隐式函数的导数,计算等高线的斜率(该导数在上面定义为
    g(x,y)
  • 最后,我们有箭头的位置以及它们的斜率,这样我们就可以直接使用
    和向量
    样式来绘制箭头。上面,
    delta
    参数指定了
    x
    方向上的小位移-这是为了确保只有箭头的头部可见
  • 最后,图表如下所示: