在 gnuplot 中,如何在曲线和 zmin 以外的任何东西之间进行填充?

How can you fill between a curve and anything other than zmin in an splot in gnuplot?

我希望能够创建与此类似的 3D 图:

         z ^  **
           |     *
           |       ***                   **
           |           *               *###*
           |             *           *######**  * ***
           |               *    ****###########*#####
           |               ###*######################
           ,-----------------------------------------> y
          /   /   /   /   /   /   /   /   /   /   /
         /---0---0---0---1---1---1---0---0---0---0    1
        /   /   /   /   /   /   /   /   /   /   /
       /---0---0---0---0---1---1---1---0---0---0    2
      /   /   /   /   /   /   /   /   /   /   /
     /---0---0---0---0---0---1---1---1---1---0    3
    /   /   /   /   /   /   /   /   /   /   /
   /---0---0---0---0---0---0---0---1---1---1    4
x v   1   2   3   4   5   6   7   8   9   10

x-y依赖的 3D 图 surface/contour 函数 g(x,y) 的图和 y-[ 中的 2D 函数 f(y) =20=] 如果 g(x,y) > 0...

则填充的平面

我的方法是使用 gnuplot 中的 filledcurves 选项,但我不太能做到正确。

在 2D 绘图中,您可以做的是(例如使用 f = sin(x)g = -0.5):

plot '+' u 1:(()>0?sin():-1/0) w filledcurves above y1=-0.5 

导致: 然而,在 3D 图中,当我尝试类似的操作时:

xMIN = -1.5
xMAX = 0.5
yMIN = -0.5
yMAX = 1.5
zMIN = -4
zMAX = 8
set isosamples 100
set xyplane at 0
set xrange [xMIN:xMAX]
set yrange [yMIN:yMAX]
set zrange [zMIN:zMAX]
f(x) = 3*sin(3*x)+x**2
g(x,y) = -6*x**2 -12*y**2 - 8*x*y + 6*y+ 2
max(a,b) = a>b?a:1/0
set hidden
set view 45
splot max(g(x,y),0), \
      '++'   u 1:(1.5):(f()) w l, \
      ''   u 1:(1.5):(g((),()) > 0 ? f() : -1/0) w filledcurves

结果:

这几乎是我想要的,但填充总是在 zMIN 之前完成,但我想指定例如它遮蔽直到 0 或一条曲线: 在最后一行后添加 above y1=0 给我:

      "3D.gpl", line 22: unexpected or unrecognized token

此外,指定第四个数据字段,如

      ...:(-0) w filledcurves 

就像在 2D 情况下一样,只需更改此处的颜色,因此设置第二条曲线直到填充似乎是不可能的...

我确实在 gnuplotting 上看到了 this question as well as this 博客 post,但是这两个答案和 post 似乎都有同样的问题:默认情况下它们都填充到 zmin。

经过一些修补,我确实设法接受了:

我在这里使用的事实是域中有点 g(x,y\') > 0 和其他点 g(x,y\'\') ≤ 0 任何 x。 这导致了一个非常 hacky 的解决方案,但是:

  1. 为了使其足够密集,您必须修改采样率,这也会影响 g 的曲面图...事实上,简单地设置一个非常高的采样率似乎会使绘图完全崩溃我只会看到一部分!

  2. 因为 'filling' 现在实际上是一个被挤压成二维平面的曲面图,你会看到它的底部有不同的颜色,当然你可以通过设置 set hidden3d offset 0 来防止这种情况但是这个选项是全局的,适用于您可能实际上不想要它的任何其他表面...

看看是否有更严格的解决方案会很有趣!

将 gnuplot 脚本的最后一行替换为

  ''   u 1:(1.5):(g((),()) > 0 ? f() : -1/0) w impulse lw 5

给出以下内容。有帮助吗?