如何在带有图像的 2D 图上绘制遮罩(图案填充)- gnuplot

how to draw a mask (pattern fill) over a 2D plot with image - gnuplot

我有一个包含样式数据的文本文件:

0 0 123
0 1 1345
. . .
x(int) y(int) intensity(double)
. . .
0 max size y 1345
1 0 564
. . .
max size x max size y intensity last point

此数据表示在其上扩散的物质的二维地图,我可以使用 1:2:3 w 图像命令来绘制颜色:

plot data.dat u ():():3 w image

我现在的问题是:我也知道我的 2D 平面的边界条件,也就是说,并非 2D 平面的每个正方形都可用于物质漫反射,虽然我知道在这些区域中强度将为 0 , 我想用图案填充绘制这些区域。为了了解这些区域,我有另一个文件:

0 0 1
0 1 0
. . .
x(int) y(int) value
. . .
0 max size y 0
1 0 0
. . .
max size x max size y value last point

如果是可访问区域,则值为 0,否则为 1。你会怎么画这部分?

这不是一个非常 "efficient" 的解决方案,但是为了用图案填充掩码,可以处理相应的文件并在标记为 "accessible" 的每个坐标处放置一个矩形。

下面的脚本首先通过stats命令确定掩码文件中的记录数,循环处理该文件,并在每次迭代extracts中处理相应的行。如果第三列(保存到变量z中)的值等于1,则在相应位置生成一个基本矩形。

fName = 'mask.dat'
stats fName nooutput

unset key
set size ratio -1
set xtics out nomirror
set ytics out nomirror

w = 1.
h = 1.
set xr [STATS_min_x-w/2:STATS_max_x+w/2]
set yr [STATS_min_y-h/2:STATS_max_y+h/2]

#unset colorbox

do for [i=0:STATS_records-1] {
    stats fName using (x=, y=, z=) every ::i::i nooutput
    if(z == 1){
        set object \
            rectangle \
            center x,y \
            size w,h \
            fc rgb 'red' \
            fs transparent pattern 4 \
            noborder \
            front
    }
}

set palette defined (0 "black", 1 "white")
plot 'data.dat' u 1:2:3 w image

使用随机数据(在 20x20 网格上生成),生成: