代码之家  ›  专栏  ›  技术社区  ›  Sergio

线条上的箭头

  •  1
  • Sergio  · 技术社区  · 7 年前

    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的位置? enter image description here

    1 回复  |  直到 7 年前
        1
  •  1
  •   ewcz    7 年前

    实现这一目标的一种方法如下:

    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
    

    战略是:

    1. 首先生成感兴趣函数的轮廓( f(x,y) 并通过以下方式将其保存到文件中 set table
    2. 对于选定值 x (例如 x_ref=2 f(x_ref, y) . 因为此函数不依赖于 x个 ,生成的等高线将只是与 x- 因此,为了绘制与等高线的交点 f(x,y) ,可以只取每个块(每个等高线)的第一个点,并用 x个 -坐标设置为 x_ref .
    3. 使用 formula 对于隐式函数的导数,计算等高线的斜率(该导数定义如下 g(x,y) )
    4. with vectors 风格在上面 delta 参数指定在 x个 -方向-这是为了 achieve 只有箭头的头部可见。

    最后,图表如下所示: enter image description here