我有一个类似这样的数据文件:
# 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)作为数据文件。但是我该怎么做或者有更简单的方法吗?
答案 0 :(得分:1)
好的,我找到了解决方案。 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: