在 gnuplot 中由数据点绘制的两条平滑线之间填充颜色

Fill colour between two smooth lines drawn by data points in gnuplot

我有包含三列的文件“data.txt”。第 1 列用于 x 轴。我想绘制对应于第 2 列和第 3 列数据点的平滑曲线,然后在这两条线之间填充颜色。

文件内容为;

10    -1.3     1.1
20    -0.956   0.933
50    -0.761   0.684
80    -0.523   0.439
110   -0.227   0.20
130   -0.07    0.06

我的脚本台词是,

plot “data.txt” u 1:2 smooth bezier w filledcurves above,\
“data.txt” u 1:3 smooth bezier w filledcurves below

但我没有得到想要的阴影图。

我想你在这里有两个挑战:

  • 不能同时平滑和填充
  • 您只能在同一数据集或文件的两列之间填充

一种可能的方法如下:

  • 将数据 smooth bezier 绘制成 table $Smooth
  • N是组合平滑数据的行数$Smooth
  • 使用第 1 行和第 1 行+N/2、第 2 行和第 2 行+N/2 等将这些平滑数据合并到数据集 $Paste
  • 对于填充,您必须使用第 1、2 和 5 列

脚本:

### fill area between smoothed curves
reset session

$Data <<EOD
  0    0   90
 10   10   50
 50   20   40
 80   50   60
100   30   50
EOD

set table $Smooth
    set samples 20
    plot $Data u 1:2 smooth bezier
    plot $Data u 1:3 smooth bezier
unset table

set print $Paste
    N = |$Smooth|
    do for [i=1:N/2] {
        print $Smooth[i].$Smooth[i+N/2]
    }
set print

plot $Data u 1:2:3  w filledcurves  lc rgb 0xcc0000ff ti "fill between data", \
        '' u 1:2    w lp pt 7       lc "red"          ti "original data", \
        '' u 1:3    w lp pt 7       lc "red"          notitle, \
     $Smooth u 1:2  w lp pt 7       lc "green"        ti "smoothed curves", \
     $Paste  u 1:2:5 w filledcurves lc rgb 0xccff0000 ti "fill between smoothed"
### end of script

结果:

据我了解,abovebelow 需要三列输入,这不适用于 smooth

但从 this and this 答案开始,您可以尝试以下操作:

set xzeroaxis
set tics front

plot "data.txt" u 1:3 smooth bezier notitle w filledcurves x1 lc rgb "#b0ffff00", \
     "data.txt" u 1:2 smooth bezier notitle w filledcurves x1 lc rgb "#00ffffff", \
     "data.txt" u 1:3 smooth bezier lt 1, \
     "data.txt" u 1:2 smooth bezier lt 2

两个 filledcurves 图都从曲线延伸到 x-axis,第二个白色覆盖第一个黄色曲线,留下黄色两条曲线之间的 space。

有关颜色的详细信息,请参阅 help lchelp linecolor

这是结果:

为了将来参考,gnuplot (5.5) 的开发版本大大扩展了平滑选项。对于您的情况,显而易见的命令按预期工作。唯一需要注意的是,对于开放曲线(端点不相等),您必须使用 smooth sbezier 而不是 smooth bezier.

$DATA << EOD
10    -1.3     1.1
20    -0.956   0.933
50    -0.761   0.684
80    -0.523   0.439
110   -0.227   0.20
130   -0.07    0.06
EOD

set xrange noextend
set style fill transparent solid 0.25
plot $DATA using 1:2:3 smooth sbezier with filledcurves between, \
     '' using 1:2 with lp, '' using 1:3 with lp