gnuplot 中的数据平滑

来源:互联网 发布:人伤查勘岗 知乎 编辑:程序博客网 时间:2024/05/18 01:43

[本文最早写于 2010-10-07 搜狐博客,因为博客搬家了一起搬到了这里。原创文章,转载请注明出处]

 gnuplot 中可以利用 smooth 关键字实现数据的平滑,平滑的方法有多种,最主要的几种如下:

unique
frequency
bezier
sbezier
csplines
acsplines

其中 unique 的作用是首先将数据点按照 x 的大小关系排序。如果有多个数据点的 x 值相同的话则取这些数据点的平均值。
frequency与 unique差不多,也是首先将数据点按照 x 的大小关系排序,但是如果多个数据点的 x 值相同的话则将这些数据点的 y 值叠加。

bezier 用 n 次 的 bezier 曲线连接数据点,n 是数据点的个数。曲线保证过头尾两个数据点,但是中间的数据点一般就不会经过了。这样的曲线足够光滑但不能保证通过所有的数据点。

sbezier 相当于首先应用 unique 将数据排序并将相同 x 值的数据取平均,然后应用 bezier。

csplines 相当于首先应用 unique 将数据排序并将相同 x 值的数据取平均,然后应用自然样条插值。获得的曲线保证通过所有的数据点(unique 处理过的数据点)。

acsplines 相当于首先应用 unique 将数据排序并将相同 x 值的数据取平均,然后应用加权的自然样条插值。加权值通过 using 关键字指定。
加权后的曲线不一定通过所有的数据点。权值越大就越接近数据点。

下面是一个例子,数据文件 “price.dat"
# Average PQR and XYZ stock price (in dollars per share) per calendar year
1975 49 162
1976 52 144
1977 67 140
1978 53 122
1979 67 125
1980 46 117
1981 60 116
1982 50 113
1983 66 96
1984 70 101
1985 91 93
1986 133 92
1987 127 95
1988 136 79
1989 154 78
1990 127 85
1991 147 71
1992 146 54
1993 133 51
1994 144 49
1995 158 43

命令:
plot "price.dat" using 1:2 with linespoints,"" using 1:2 title "bezier" smooth bezier,"" using 1:2 title "csplines" smooth csplines

plot [1975:1995][40:160] "price.dat" using 1:2 with points title "price.dat", "" u 1:2:(1) smooth acsplines title "1", "" using 1:2:(1/50.) smooth acsplines title "1/50", "" using 1:2:(50) smooth acsplines  title "50", "" using 1:2:(1/10000.) smooth acsplines title "1/10000"