使用 pm3d 和 dgrid3d 的 Gnuplot 热图在图中留下空白

Gnuplot heat map using pm3d and dgrid3d leaves white spaces in plot

我正在尝试从数据中生成类似绘图的热图。数据以

的形式给出
# x      y      f(x,y)
 1.02   0.98    23.943
 1.99   0.99    24.05
 .99    2.01    22.00
...

而且上面并没有真正的网格,它们只是一些随机点和它们的特定值。否则,据我所知,我可以使用 image 之类的东西。

为了说明我的问题,我为二维高斯峰创建了一个数据文件(参见 pastebin)。数据说明:

现在使用

绘制此图
set view map
set dgrid3d 50,50,2
set pm3d at b
unset key
unset surface
splot "data.txt"    # using 2d gauss data as example

给我一个如下图:

我不明白的是彩色表面和图的实际边界之间的空白。此处显示在底部、顶部、右侧和左侧。即使我放大到应该使用 dgrid3d 创建表面的范围,空白仍然存在,宽度不同。

现在正在尝试绘制(使用上述设置)

set isosample 100,100
splot exp(-x**2 -y**2)

给我一个填满整个绘图区域的绘图。无论我放大或缩小多远。任何地方都不会出现空白。参见:

我在这里 (Annoying spacing in gnuplot pm3d color maps) 找到了这个 post,其中 op 回答说即使通过绘制函数,空格仍然存在:

I just tried plotting a simple exp(-x²) but the gap is still there. :/ – stonebird Jun 6 '16 at 10:31

然而,他可以通过为 xy 值定义一个非常具体的范围来解决这个问题。但这对我不起作用,因为很难找出它实际适用于哪些值。

是否有可能从填充整个绘图区域的数据点创建类似绘图的热图?

使用 gnuplot 5.0 补丁级别 6

我认为这是网格化的固有问题(+ 与 pm3d 类似)。来自 help dgrid3d :

创建一个网格,其尺寸源自分散数据的边界框,大小由 row/col_size 参数指定,用于绘图和等高线绘制。

Gnuplot 首先删除 x/yranges 内的所有数据点,然后在这些数据点上创建一个边界框(可能有点小),然后才创建网格化数据。

理想情况下,应该能够关闭边界框的创建,让 gnuplot 只制作一个跨越整个 x/yrange.

的网格

解决这个问题的方法是使用 set table 将网格数据绘制到一个文件(或者,从 gp5 开始,绘制到一个内联 $datablock),然后关闭 dgrid3d,并绘制这个数据块。然后你 仍然 必须精确缩放到 min/max x/y 具有数据点的值(以摆脱白色 space),但你可以至少轻松地查一下。

Oooor 跳过数据块创建并自动剪切放大视图:

  1. 用 pm3d / dgrid3d 绘制数据集
  2. 放大到你想要的区域
  3. 现在通过

    剪掉白色space
    set xrange [GPVAL_DATA_X_MIN:GPVAL_DATA_X_MAX]
    set yrange [GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX]
    replot
    

问题是您可能再次在边界处有伪影,所以您可能仍想如上所述将网格化与绘图分开。

    set dgrid3d
    set table $datagrid
    splot dataf
    unset table
    unset dgrid3d

    set pm3d; set view map
    splot $datagrid
    #now zoom to whatever view you would like to see

    set xrange [GPVAL_DATA_X_MIN:GPVAL_DATA_X_MAX]
    set yrange [GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX]
    replot

(还要查看 help dgrid3d 以选择合适的插值 algorithm/kernel)