在gnuplot中拟合和绘制一系列

时间:2017-10-25 09:51:57

标签: plot gnuplot

这与此questionthis类似,但我的问题是我有几百个文件需要同时安装并绘制在一个图表上。与发布的其他问题不同,我正在寻找每个文件的最佳匹配,而不是全局数据集,因此cat无法正常工作。

我希望像fit.. for一样使用plot,但它的效果并不好。这是我到目前为止所得到的:

f(x) = 1+d*exp(-(x-f)**2/(2*(g**2)))+a*exp((-(x-b)**2)/(2*(c**2)))

filename(n) = sprintf("rheosaxs_saxs_%005d_0001_var_rebin_div.dat", n)
fit f(x) for [n=575:584] filename(n) u 1:2 via a,b,c,d,f,g
plot for [n=575:584] filename(n) using 1:2, f(x)

我得到的错误是:line 60: undefined variable: for 对应于fit f(x) for [n=a:b]

我知道我的起始参数是合理的,因为我可以在没有fit命令的情况下绘制它们,它们看起来很合理。同样地,我的plot for也能正常工作。

有什么想法吗?谢谢:))

1 个答案:

答案 0 :(得分:1)

在版本5.2中,gnuplot引入了数组,允许您保存每个拟合的结果并在以后绘制它们。

简化的示例脚本将是

file(n) = sprintf('myfile_%d.dat', n)
f(a, x) = a*x

array A[10]
do for [i=1:10] {
    tmpA = 1
    fit f(tmpA, x) file(i) via tmpA
    A[i] = tmpA
}

plot for [i=1:10] file(i),\
     for [i=1:10] f(A[i], x)

尽管gnuplots数组是作为用户变量的链接列表实现的,但是不能直接使用A[i]进行拟合,但我必须使用临时变量来使其正确。

一个完整的工作示例,包括生成随机数据,使用来自gnuplot的python,uargh;):

# generate some random data
system("python3 -c 'import random\nfor i in range(1, 11):\n\twith open(\"output_{0}.dat\".format(i), \"w\") as f:\n\t\tf.write(chr(10).join([str(i*100 + i* x * (1 + 0.1*(random.random()-0.5))) for x in range(0,100)]))'")


file(n) = sprintf('output_%d.dat', n)

f(a, b, x) = a*x + b
array A[10]
array B[10]
do for [i=1:10] {
    tmpA = 1
    tmpB = 1
    fit f(tmpA, tmpB, x) file(i) u 0:1 via tmpA, tmpB
    A[i] = tmpA
    B[i] = tmpB
}

plot for [i = 1:10] file(i) u 0:1 with points lt i notitle, \
     for [i=1:10] f(A[i], B[i], x) with lines lt i notitle

enter image description here

BTW:没有fit for,因为这相当于do for { fit }。但是在绘图时,plot for会生成包含多个函数的单个绘图,而do for { plot }生成多个绘图,应该与multiplot一起使用