使用 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
然而,他可以通过为 x
和 y
值定义一个非常具体的范围来解决这个问题。但这对我不起作用,因为很难找出它实际适用于哪些值。
是否有可能从填充整个绘图区域的数据点创建类似绘图的热图?
使用 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 跳过数据块创建并自动剪切放大视图:
- 用 pm3d / dgrid3d 绘制数据集
- 放大到你想要的区域
现在通过
剪掉白色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)
我正在尝试从数据中生成类似绘图的热图。数据以
的形式给出# 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
然而,他可以通过为 x
和 y
值定义一个非常具体的范围来解决这个问题。但这对我不起作用,因为很难找出它实际适用于哪些值。
是否有可能从填充整个绘图区域的数据点创建类似绘图的热图?
使用 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 跳过数据块创建并自动剪切放大视图:
- 用 pm3d / dgrid3d 绘制数据集
- 放大到你想要的区域
现在通过
剪掉白色spaceset 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)