我试图使用gnuplot绘制一组数据点的直线。问题是有些点远离平均拟合线,我想忽略它们,因为它们以不好的方式影响线的斜率。你怎么能这样做?
感谢。
答案 0 :(得分:2)
一种方法是进行一次拟合,然后用第二个函数重新拟合,并根据相对于第一个拟合的值区分一些数据点。为了区分异常值,我为它们分配了一个非常高的方差(在第三个using
列中)。在第二列中使用带有1/0
的未定义数据值不起作用。
考虑文件test.dat
1 1
2 2
3 5
4 4
适合使用:
f(x) = a*x + b
g(x) = c*x + d
fname = 'test.dat'
limit = 1
fit f(x) fname via a,b
fit g(x) fname using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000) via c,d
set key left
set offset 0.5,0.5,0.5,0.5
plot f(x), g(x), fname
4.6.3的结果是:
使用using
关键字,您可以选择使用数据文件的哪些列。最简单的情况是using 1:2
,它将第一列用作x
,将第二列用作y
(这在第一个fit
调用中隐含地假设)。用例如using 1:2:3
可以使用第三列作为相应数据点的权重(在fit
命令的情况下)。这里,较高的值意味着较大的差异,因此保真度较低(请参阅fit
命令的文档)。
不仅可以选择列,还可以执行using 1:($2*2)
之类的计算,将第二列乘以2
,并将结果作为y
- 值。 $2
是column(2)
的简写,整个语句的括号是必需的。
因此,using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000)
执行以下操作:f($1)
是先前适合某个x
值的值,$2
是相应的y
-value来自数据文件。因此,如果数据abs(f($1) - $2)
的距离y
- 来自先前拟合结果的值低于limit
,那么1
将用作权重。否则会使用非常大的1000
权重,这会导致几乎忽略此数据点。