如何在 gnuplot 中绘制两条拟合线的交点?
How do I plot the intersection of two fit lines in gnuplot?
我有一个看起来像这样的数据文件:
# Test of 6
0.1 3.2
0.4 5.9
0.7 8.0
0.9 10.1
0.1 1.5
0.4 4.3
0.7 9.5
0.9 13.5
# Test of 10
0.1 5.5
0.4 6.3
0.7 6.9
0.9 8.5
0.1 0.5
0.4 3.3
0.7 8.5
0.9 15.5
# Test of 15
0.1 12.5
0.4 13.3
0.7 13.5
0.9 15.5
0.1 1.5
0.4 7.3
0.7 15.5
0.9 16.5
然后我使用 gnuplot 找到每组的拟合线,以及两条拟合线的交叉点:
set terminal pngcairo enhanced
set output 'image.png'
unset key
set xrange [0:20]
set yrange [0:1]
f(x) = a*x + b
g(x) = c*x + d
fit f(x) "data.dat" i 0 u 1:2 via a,b
fit g(x) "data.dat" i 1 u 1:2 via c,d
p1 = (d - b) / (a - c)
fit f(x) "data.dat" i 2 u 1:2 via a,b
fit g(x) "data.dat" i 3 u 1:2 via c,d
p2 = (d - b) / (a - c)
fit f(x) "data.dat" i 4 u 1:2 via a,b
fit g(x) "data.dat" i 5 u 1:2 via c,d
p3 = (d - b) / (a - c)
# what is the real way?
# set label at 6, p1 "" point pointtype 7 pointsize 2
# set label at 10, p2 "" point pointtype 7 pointsize 2
# set label at 15, p3 "" point pointtype 7 pointsize 2
# plot 1/0
我可以使用标签来设置我想要的点,但我真的希望能够找到这些点的拟合线。如果我能治疗 (6,p1),我想我能做到; (10,p2); (15,p3) 作为数据文件。但是我该怎么做,或者有更简单的方法吗?
好的,我找到了解决方案。 Gnuplot 已命名数据块。您既可以打印到数据块也可以从数据块绘图。使用问题中的数据,最终的绘图文件是:
set terminal pngcairo enhanced
set output 'image.png'
unset key
set xrange [0:20]
set yrange [0:1]
f(x) = a*x + b
g(x) = c*x + d
fit f(x) "data.dat" i 0 u 1:2 via a,b
fit g(x) "data.dat" i 1 u 1:2 via c,d
p1 = (d - b) / (a - c)
fit f(x) "data.dat" i 2 u 1:2 via a,b
fit g(x) "data.dat" i 3 u 1:2 via c,d
p2 = (d - b) / (a - c)
fit f(x) "data.dat" i 4 u 1:2 via a,b
fit g(x) "data.dat" i 5 u 1:2 via c,d
p3 = (d - b) / (a - c)
set print $points
print 6,p1
print 10,p2
print 15,p3
fit f(x) $points u 1:2 via a,b
plot $points w p pt 7 ps 2, f(x)
这会生成如下 png:
我有一个看起来像这样的数据文件:
# Test of 6
0.1 3.2
0.4 5.9
0.7 8.0
0.9 10.1
0.1 1.5
0.4 4.3
0.7 9.5
0.9 13.5
# Test of 10
0.1 5.5
0.4 6.3
0.7 6.9
0.9 8.5
0.1 0.5
0.4 3.3
0.7 8.5
0.9 15.5
# Test of 15
0.1 12.5
0.4 13.3
0.7 13.5
0.9 15.5
0.1 1.5
0.4 7.3
0.7 15.5
0.9 16.5
然后我使用 gnuplot 找到每组的拟合线,以及两条拟合线的交叉点:
set terminal pngcairo enhanced
set output 'image.png'
unset key
set xrange [0:20]
set yrange [0:1]
f(x) = a*x + b
g(x) = c*x + d
fit f(x) "data.dat" i 0 u 1:2 via a,b
fit g(x) "data.dat" i 1 u 1:2 via c,d
p1 = (d - b) / (a - c)
fit f(x) "data.dat" i 2 u 1:2 via a,b
fit g(x) "data.dat" i 3 u 1:2 via c,d
p2 = (d - b) / (a - c)
fit f(x) "data.dat" i 4 u 1:2 via a,b
fit g(x) "data.dat" i 5 u 1:2 via c,d
p3 = (d - b) / (a - c)
# what is the real way?
# set label at 6, p1 "" point pointtype 7 pointsize 2
# set label at 10, p2 "" point pointtype 7 pointsize 2
# set label at 15, p3 "" point pointtype 7 pointsize 2
# plot 1/0
我可以使用标签来设置我想要的点,但我真的希望能够找到这些点的拟合线。如果我能治疗 (6,p1),我想我能做到; (10,p2); (15,p3) 作为数据文件。但是我该怎么做,或者有更简单的方法吗?
好的,我找到了解决方案。 Gnuplot 已命名数据块。您既可以打印到数据块也可以从数据块绘图。使用问题中的数据,最终的绘图文件是:
set terminal pngcairo enhanced
set output 'image.png'
unset key
set xrange [0:20]
set yrange [0:1]
f(x) = a*x + b
g(x) = c*x + d
fit f(x) "data.dat" i 0 u 1:2 via a,b
fit g(x) "data.dat" i 1 u 1:2 via c,d
p1 = (d - b) / (a - c)
fit f(x) "data.dat" i 2 u 1:2 via a,b
fit g(x) "data.dat" i 3 u 1:2 via c,d
p2 = (d - b) / (a - c)
fit f(x) "data.dat" i 4 u 1:2 via a,b
fit g(x) "data.dat" i 5 u 1:2 via c,d
p3 = (d - b) / (a - c)
set print $points
print 6,p1
print 10,p2
print 15,p3
fit f(x) $points u 1:2 via a,b
plot $points w p pt 7 ps 2, f(x)
这会生成如下 png: