(另一种)开发版本 5.5 的新方法
开发版有一个新的机制masking
。这里我们首先将整个图形的填充区域创建为image
,然后将所需区域之外的所有内容都隐藏起来,即不可见。遮蔽区域是一个(复杂的)多边形,我们必须分两步构建它:首先,在正常绘图方向上创建上边界作为两个数据集的较大值,然后下边界需要向后创建作为最小值,以便最终创建适当的多边形。出于说明目的,我使用了@Christoph's answer中的函数并将它们转换为一个看起来像 OP 数据文件的数据集:
set yrange[0:1]
set xrange[400:2500]
set ur [400:2500]
set vr [0:1]
set samples 1000
set isosamples 1000
fhot(x) = 0.1*exp(-((x-400)/200)**2) + 0.8*exp(-((x-2000)/300)**2)
fcold(x) = 0.25*exp(-((x-700)/100)**6)+ 0.4 - (2e-4*(x-2500))**2
set table $data
plot '+' u 1:(fhot($1)):(fcold($1)) w table
unset table
现在计算上下边界:
set table $upper
plot $data u 1:($2>=$3 ? $2 : $3) w table
unset table
# gnuplot has no build-in "backwards" plotting
set table $lower
plot for [i=1:|$data|] $data every ::(|$data|-i)::(|$data|-i) u 1:($2<=$3 ? $2 : $3) w table
unset table
set table $mask
plot $upper w table
plot $lower w table
unset table
我发现一个完全不透明的调色板太多了,因此让我们定义一个新的、半透明的调色板:
set palette defined (-1 "blue", 0 "white", 1 "red")
set colormap new MYPALETTE
do for [i=1:|MYPALETTE|] {MYPALETTE[i] = MYPALETTE[i] + (int(0.5*0xff)<<24)}
unset colorbox
现在在实际的绘图命令中,第一个元素是掩蔽数据,它本身不会绘制任何东西,而是为绘图的下一个元素做准备:
plot $mask w mask not, '++' u 1:2:(fhot($1)-fcold($1)) mask w image fc palette MYPALETTE not, fhot(x) lc "red" lw 3, fcold(x) lc "blue" lw 3