在 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
结果:
据我了解,above
和 below
需要三列输入,这不适用于 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 lc
或 help 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
我有包含三列的文件“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
结果:
据我了解,above
和 below
需要三列输入,这不适用于 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 lc
或 help 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