我正在尝试使用 gnuplot 通过一组数据点绘制一条直线。问题是有一些远离平均拟合线的点我想忽略,因为它们以不好的方式影响线的斜率。你怎么能那样做?
谢谢。
一种方法是进行一次拟合,然后使用第二个函数重新进行拟合,并根据与第一次拟合相关的值来区分一些数据点。为了区分异常值,我为它们分配了一个非常高的方差(在第三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
,它使用第一列 asx
和第二列 as (这是在第一次调用y
中隐含的假设)。fit
例如using 1:2:3
,可以使用第三列作为相应数据点的权重(在fit
命令的情况下)。在这里,高值意味着较大的方差,因此保真度低(请参阅fit
命令文档)。
除了选择列之外,还可以进行类似的计算using 1:($2*2)
,将第二列乘以2
并将结果作为y
-value。$2
是 的简写column(2)
,整个语句周围的括号是必需的。
因此,using 1:2:(abs(f($1)-$2) < limit ? 1 : 1000)
执行以下操作:f($1)
是先前拟合某个x
值的值,$2
是数据文件中相应的y
值。因此,如果abs(f($1) - $2)
数据y
值与先前拟合结果的距离低于 a limit
,则将1
其用作权重。否则使用非常大的权重1000
,导致几乎忽略该数据点。