这与此question和this类似,但我的问题是我有几百个文件需要同时安装并绘制在一个图表上。与发布的其他问题不同,我正在寻找每个文件的最佳匹配,而不是全局数据集,因此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
也能正常工作。
有什么想法吗?谢谢:))
答案 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
BTW:没有fit for
,因为这相当于do for { fit }
。但是在绘图时,plot for
会生成包含多个函数的单个绘图,而do for { plot }
生成多个绘图,应该与multiplot
一起使用