gnuplot函数画图

1977阅读 0评论2011-12-15 桔色花花朵
分类:

误差条(error bar) Error bar 是在图像上表现数据误差范围的一种方式。对于含有误差项的数据,除了通常的 x 轴和 y 轴两列数据外,我们还需要有额外的误差数据列。

x 数据列举例,如果误差用标准差 σx 来表示,那么数据取值范围可以表示为 [x-σx, x+σx],这时候只要增加一列误差项就行了,所以一共需要 3 列数据。如果误差用最小值 xmin 和最大值 xmax 来表示,那么数据取值范围可以表示为 [xmin, xmax],这时候需要增加两列误差项,所以一共需要 4 列数据。对于 y 数据误差,表达方法和 x 类似。如果同时包含 xy 误差,就需要把两者结合起来。

在 gnuplot 里,error bar 的基本使用方法是:

plot "数据文件名" using with

using
命令在之前的“多组数据绘图”博文里已经介绍过,目的是选择哪些列数据进行绘图,数据列数必须和后面选择的绘图方式对应。with 命令后面跟的是绘图方式,选择用 xerrorbarsyerrorbars,还是 xyerrorbars。根据不同绘图方式,所需数据列数分别为:
下面我们举一个例子,这是一个测量在液体中聚焦的脉冲激光在焦点处产生气泡几率的实验,数据文件(probability.dat)如下:

### 文件开始 ###
# Ave Energy    Probability     Min Energy      Max Energy      Energy SD
# (micro J)     (%)             (micro J)       (micro J)       (micro J)
# =======================================================================
9.08            0               8.96            9.15            0.06
10.00           2               9.91            10.08           0.05
10.52           3               10.41           10.60           0.06
11.03           10              10.90           11.11           0.06
11.52           25              11.38           11.62           0.07
12.03           57              11.90           12.13           0.07
12.52           88              12.38           12.64           0.08
13.01           93              12.86           13.09           0.07
13.51           100             13.38           13.61           0.08
14.52           100             14.38           14.67           0.08

### 文件结束 ###

x 轴数据为激光能量,y 轴数据为气泡产生几率,这里只有 x 误差,并且同时包含了最小最大值和标准差。我们现在用最小最大值画图:
gnuplot> set xrange [8:16]
gnuplot> set yrange [-5:105]
gnuplot> unset key
gnuplot> set xlabel "Laser Pulse Energy (μJ)"
gnuplot> set ylabel "Bubble Formation Probability (%)"
gnuplot> plot "probability.dat" using 1:2:3:4 with xerrorbars


如果既要画 error bar,又要连线,可以把上述命令中的 errorbars 换为 errorlines
gnuplot> plot "probability.dat" using 1:2:3:4 with xerrorlines


拟合
gnuplot 除了绘图功能之外,最简单实用的功能就是拟合了。gnuplot 可以进行单变量甚至多变量的线性和非线性拟合。虽然可能不像专门的数学软件那么强大,但是足以对付日常需要了。我们拿上一篇文章里的数据来举例子。

首先,要定义一个待拟合的函数:
gnuplot> f(x)=50*(1+erf(a*(x-b)))
这里使用了误差函数 erf(x),有两个待定的参数:a, b。下面我们生成一个文件“fit.par”,里面包含的是参数 ab 的初值:
a = 1
b = 12

初值的选择要尽可能贴近结果,否则可能导致误差甚至无法收敛。下面我们进行拟合:
gnuplot> fit [8:16] f(x) 'probability.dat' using 1:2 via 'fit.par'
gnuplot 里面关于拟合的命令是 fit,后面的自变量取值范围不是必需的。f(x) 函数已经在上面定义过了,数据文件“probability.dat”也已经在上一篇博文中交代过了。via 后面跟的是参数变量列表文件。执行 fit 命令之后,gnuplot 会输出一堆结果。我们忽略那些中间运算,只把最后结果贴在下面:

After 5 iterations the fit converged.
final sum of squares of residuals : 41.9399
rel. change during last iteration : -4.27973e-07

degrees of freedom    (FIT_NDF)                        : 8
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 2.28965
variance of residuals (reduced chisquare) = WSSR/ndf   : 5.24249

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a               = 1.15661          +/- 0.06331      (5.474%)
b               = 11.9027          +/- 0.02383      (0.2002%)


correlation matrix of the fit parameters:

               a      b     
a               1.000
b               0.014  2.000


这段文字说明,经过 5 次迭代,gnuplot 得到了收敛的结果。中间部分是参数 ab 的最终取值以及渐近标准差(asymptotic standard error)。渐近标准差的计算是基于线性拟合的,对于非线性拟合,渐近标准差一般都比真的标准差小,所以这个数字只能用于定性分析。而最后给出的相关矩 阵(correlation matrix)可以帮助我们确认渐近标准差的可靠度,非对角元素绝对值越小,渐近标准差越接近真实标准差。

好了,现在我们可以把数据和拟合曲线画在同一张图上了:
gnuplot> set xrange [8:16]
gnuplot> set yrange [-5:105]
gnuplot> unset key
gnuplot> set xlabel "Laser Pulse Energy (μJ)"
gnuplot> set ylabel "Bubble Formation Probability (%)"
gnuplot> plot "probability.dat" using 1:2:3:4 with xerrorbars, f(x) lw 2 lc rgb "orange"


上一篇:【原创】源码配置bind主从时的注意事项
下一篇:ubuntu 11.10的ati显卡驱动安装以及实现3d