如何在gnuplot的一个窗口中合并所有绘图

如何在gnuplot的一个窗口中合并所有绘图,gnuplot,curve-fitting,Gnuplot,Curve Fitting,我知道类似的问题在SO中被多次询问和回答。 在这里,我有一些独特的东西,包括适合每个情节。 我正在使用 f(x) = (a0 + a1/x) fit f(x) 'test.data' using 1:2 via a0,a1 plot 'test.data' using 1:2 w points pt 1 t , f(x) t sprintf("K_{fit} = a_0 + a_1/T", a0) f(x) = (a0 + a1/x) fit f(x) 'test.d

我知道类似的问题在SO中被多次询问和回答。 在这里,我有一些独特的东西,包括适合每个情节。 我正在使用

f(x) = (a0 + a1/x)
fit f(x) 'test.data' using 1:2 via a0,a1
plot 'test.data' using 1:2 w points pt 1 t  ,  f(x) t sprintf("K_{fit} = a_0 +  a_1/T", a0)

f(x) = (a0 + a1/x)
fit f(x) 'test.data' using 1:3 via a0,a1
plot 'test.data' using 1:3 w points pt 1 t  ,  f(x) t sprintf("K_{fit} = a_0 +  a_1/T", a0)
这里我跳过其他plot命令以保持查询简短

f(x) = (a0 + a1/x)
fit f(x) 'test.data' using 1:8 via a0,a1
plot 'test.data' using 1:8 w points pt 1  ,  f(x) t sprintf("K_{fit} = a_0 +  a_1/T", a0)

f(x) = (a0 + a1/x)
fit f(x) 'test.data' using 1:9 via a0,a1
plot 'test.data' using 1:9 w points pt 1 t   ,  f(x) t sprintf("K_{fit} = a_0 +  a_1/T", a0)
使用上面的图,我得到每个图一个框

如何在单个窗口中合并所有绘图

数据文件有9列(第一列为x轴,其他列为y轴),为每个绘图插入绘图命令会使gnuplot脚本过长。是否有任何解决方法,使我不需要每次键入p“plot,并且工作可以通过一些循环完成

我尝试使用

plot for [i=1:9] 'test.data' using (i):i notitle with boxplot lt -1, \
f(x) = (a0 + a1/x)
fit f(x) 'test.data'for [i=1:9] using (i):i via a0,a1 
plot 'test.data' for [i=1:9] using (i):i w points pt 1 t ,  f(x) t sprintf("K_{fit} = a_0 +  a_1/T", a0)
但我的错误率越来越低

fit f(x) 'test.data'for [i=1:9] using (i):i via a0,a1 
                        ^
"test.gnu", line 23: Need via and either parameter list or file
下面是我的test.data文件

100.0 0.45564E+02 0.20558E+02   0.53903E+02 0.24899E+02 0.56334E+02 0.26169E+02 0.58482E+02 0.27273E+02
200.0 0.17118E+02 0.81681E+01   0.18147E+02 0.86680E+01 0.18397E+02 0.87831E+01 0.18598E+02 0.88736E+01
300.0 0.10908E+02 0.53456E+01   0.11307E+02 0.55301E+01 0.11398E+02 0.55703E+01 0.11470E+02 0.56013E+01
400.0 0.81160E+01 0.40313E+01   0.83328E+01 0.41288E+01 0.83808E+01 0.41496E+01 0.84181E+01 0.41655E+01
500.0 0.64937E+01 0.32506E+01   0.66311E+01 0.33115E+01 0.66611E+01 0.33243E+01 0.66841E+01 0.33340E+01
600.0 0.54231E+01 0.27282E+01   0.55185E+01 0.27700E+01 0.55390E+01 0.27787E+01 0.55547E+01 0.27853E+01
700.0 0.46602E+01 0.23525E+01   0.47305E+01 0.23830E+01 0.47455E+01 0.23894E+01 0.47569E+01 0.23942E+01
800.0 0.40878E+01 0.20687E+01   0.41419E+01 0.20920E+01 0.41533E+01 0.20968E+01 0.41620E+01 0.21005E+01
900.0 0.36419E+01 0.18465E+01   0.36847E+01 0.18649E+01 0.36937E+01 0.18687E+01 0.37006E+01 0.18716E+01
1000.0 0.32843E+01 0.16677E+01  0.33192E+01 0.16826E+01 0.33264E+01 0.16857E+01 0.33320E+01 0.16880E+01

如果选中“帮助适应”,您将不会发现gnuplot可以像在绘图循环中一样适应循环。 但是您可以在
do for
循环中放入多个数据列,请选中
help do
。 您可以将拟合参数存储在数组中,以便以后在
plot for
循环中进行打印。我希望您能够了解下面的示例代码是如何工作的

代码:

### fit multiple columns in a loop
reset session

f(x) = a0 + a1/x

# arrays for fit parameters
array arr0[8]
array arr1[8]

# create some random test data
do for [i=1:8] {
    arr0[i] = int(rand(0)*50)+5
    arr1[i] = int(rand(0)*10)+5
}
set print $Data
do for [x=10:50] {
    line = sprintf("%g",x/100.)
    do for [i=1:8] {
        a0 = arr0[i]
        a1 = arr1[i]
        line = line.sprintf(" %.3f",f(x/100.)+10*i)
    }
    print line
}
set print

# fit columns in a loop and put fit values into array
do for [i=1:8] {
    fit f(x) $Data u 1:i+1 via a0,a1
    arr0[i] = a0
    arr1[i] = a1
} 

set key Left
plot for [i=1:8] $Data u 1:i+1 ti sprintf("%d: a0=%.1f, a1=%.1f",i,arr0[i],arr1[i]), \
     for [i=1:8] tmp=(a0=arr0[i],a1=arr1[i]) f(x) w l lc rgb "red" not
     
### end of code
### fit multiple columns in a loop
reset session

f(x) = a0 + a1/x

# arrays for fit parameters
array arr0[8]
array arr1[8]

$Data <<EOD
100.0 0.45564E+02 0.20558E+02   0.53903E+02 0.24899E+02 0.56334E+02 0.26169E+02 0.58482E+02 0.27273E+02
200.0 0.17118E+02 0.81681E+01   0.18147E+02 0.86680E+01 0.18397E+02 0.87831E+01 0.18598E+02 0.88736E+01
300.0 0.10908E+02 0.53456E+01   0.11307E+02 0.55301E+01 0.11398E+02 0.55703E+01 0.11470E+02 0.56013E+01
400.0 0.81160E+01 0.40313E+01   0.83328E+01 0.41288E+01 0.83808E+01 0.41496E+01 0.84181E+01 0.41655E+01
500.0 0.64937E+01 0.32506E+01   0.66311E+01 0.33115E+01 0.66611E+01 0.33243E+01 0.66841E+01 0.33340E+01
600.0 0.54231E+01 0.27282E+01   0.55185E+01 0.27700E+01 0.55390E+01 0.27787E+01 0.55547E+01 0.27853E+01
700.0 0.46602E+01 0.23525E+01   0.47305E+01 0.23830E+01 0.47455E+01 0.23894E+01 0.47569E+01 0.23942E+01
800.0 0.40878E+01 0.20687E+01   0.41419E+01 0.20920E+01 0.41533E+01 0.20968E+01 0.41620E+01 0.21005E+01
900.0 0.36419E+01 0.18465E+01   0.36847E+01 0.18649E+01 0.36937E+01 0.18687E+01 0.37006E+01 0.18716E+01
1000.0 0.32843E+01 0.16677E+01  0.33192E+01 0.16826E+01 0.33264E+01 0.16857E+01 0.33320E+01 0.16880E+01
EOD

# fit columns in a loop and put fit values into array
set fit nolog
do for [i=1:8] {
    fit f(x) $Data u 1:i+1 via a0,a1
    arr0[i] = a0
    arr1[i] = a1
} 

set key Left
plot for [i=1:8] $Data u 1:i+1 ti sprintf("%d: a0=%.1f, a1=%.1f",i,arr0[i],arr1[i]), \
     for [i=1:8] tmp=(a0=arr0[i],a1=arr1[i]) f(x) w l lc rgb "red" not
     
### end of code
结果:

### fit multiple columns in a loop
reset session

f(x) = a0 + a1/x

# arrays for fit parameters
array arr0[8]
array arr1[8]

# create some random test data
do for [i=1:8] {
    arr0[i] = int(rand(0)*50)+5
    arr1[i] = int(rand(0)*10)+5
}
set print $Data
do for [x=10:50] {
    line = sprintf("%g",x/100.)
    do for [i=1:8] {
        a0 = arr0[i]
        a1 = arr1[i]
        line = line.sprintf(" %.3f",f(x/100.)+10*i)
    }
    print line
}
set print

# fit columns in a loop and put fit values into array
do for [i=1:8] {
    fit f(x) $Data u 1:i+1 via a0,a1
    arr0[i] = a0
    arr1[i] = a1
} 

set key Left
plot for [i=1:8] $Data u 1:i+1 ti sprintf("%d: a0=%.1f, a1=%.1f",i,arr0[i],arr1[i]), \
     for [i=1:8] tmp=(a0=arr0[i],a1=arr1[i]) f(x) w l lc rgb "red" not
     
### end of code
### fit multiple columns in a loop
reset session

f(x) = a0 + a1/x

# arrays for fit parameters
array arr0[8]
array arr1[8]

$Data <<EOD
100.0 0.45564E+02 0.20558E+02   0.53903E+02 0.24899E+02 0.56334E+02 0.26169E+02 0.58482E+02 0.27273E+02
200.0 0.17118E+02 0.81681E+01   0.18147E+02 0.86680E+01 0.18397E+02 0.87831E+01 0.18598E+02 0.88736E+01
300.0 0.10908E+02 0.53456E+01   0.11307E+02 0.55301E+01 0.11398E+02 0.55703E+01 0.11470E+02 0.56013E+01
400.0 0.81160E+01 0.40313E+01   0.83328E+01 0.41288E+01 0.83808E+01 0.41496E+01 0.84181E+01 0.41655E+01
500.0 0.64937E+01 0.32506E+01   0.66311E+01 0.33115E+01 0.66611E+01 0.33243E+01 0.66841E+01 0.33340E+01
600.0 0.54231E+01 0.27282E+01   0.55185E+01 0.27700E+01 0.55390E+01 0.27787E+01 0.55547E+01 0.27853E+01
700.0 0.46602E+01 0.23525E+01   0.47305E+01 0.23830E+01 0.47455E+01 0.23894E+01 0.47569E+01 0.23942E+01
800.0 0.40878E+01 0.20687E+01   0.41419E+01 0.20920E+01 0.41533E+01 0.20968E+01 0.41620E+01 0.21005E+01
900.0 0.36419E+01 0.18465E+01   0.36847E+01 0.18649E+01 0.36937E+01 0.18687E+01 0.37006E+01 0.18716E+01
1000.0 0.32843E+01 0.16677E+01  0.33192E+01 0.16826E+01 0.33264E+01 0.16857E+01 0.33320E+01 0.16880E+01
EOD

# fit columns in a loop and put fit values into array
set fit nolog
do for [i=1:8] {
    fit f(x) $Data u 1:i+1 via a0,a1
    arr0[i] = a0
    arr1[i] = a1
} 

set key Left
plot for [i=1:8] $Data u 1:i+1 ti sprintf("%d: a0=%.1f, a1=%.1f",i,arr0[i],arr1[i]), \
     for [i=1:8] tmp=(a0=arr0[i],a1=arr1[i]) f(x) w l lc rgb "red" not
     
### end of code

添加(带有OP的数据)

代码:

### fit multiple columns in a loop
reset session

f(x) = a0 + a1/x

# arrays for fit parameters
array arr0[8]
array arr1[8]

# create some random test data
do for [i=1:8] {
    arr0[i] = int(rand(0)*50)+5
    arr1[i] = int(rand(0)*10)+5
}
set print $Data
do for [x=10:50] {
    line = sprintf("%g",x/100.)
    do for [i=1:8] {
        a0 = arr0[i]
        a1 = arr1[i]
        line = line.sprintf(" %.3f",f(x/100.)+10*i)
    }
    print line
}
set print

# fit columns in a loop and put fit values into array
do for [i=1:8] {
    fit f(x) $Data u 1:i+1 via a0,a1
    arr0[i] = a0
    arr1[i] = a1
} 

set key Left
plot for [i=1:8] $Data u 1:i+1 ti sprintf("%d: a0=%.1f, a1=%.1f",i,arr0[i],arr1[i]), \
     for [i=1:8] tmp=(a0=arr0[i],a1=arr1[i]) f(x) w l lc rgb "red" not
     
### end of code
### fit multiple columns in a loop
reset session

f(x) = a0 + a1/x

# arrays for fit parameters
array arr0[8]
array arr1[8]

$Data <<EOD
100.0 0.45564E+02 0.20558E+02   0.53903E+02 0.24899E+02 0.56334E+02 0.26169E+02 0.58482E+02 0.27273E+02
200.0 0.17118E+02 0.81681E+01   0.18147E+02 0.86680E+01 0.18397E+02 0.87831E+01 0.18598E+02 0.88736E+01
300.0 0.10908E+02 0.53456E+01   0.11307E+02 0.55301E+01 0.11398E+02 0.55703E+01 0.11470E+02 0.56013E+01
400.0 0.81160E+01 0.40313E+01   0.83328E+01 0.41288E+01 0.83808E+01 0.41496E+01 0.84181E+01 0.41655E+01
500.0 0.64937E+01 0.32506E+01   0.66311E+01 0.33115E+01 0.66611E+01 0.33243E+01 0.66841E+01 0.33340E+01
600.0 0.54231E+01 0.27282E+01   0.55185E+01 0.27700E+01 0.55390E+01 0.27787E+01 0.55547E+01 0.27853E+01
700.0 0.46602E+01 0.23525E+01   0.47305E+01 0.23830E+01 0.47455E+01 0.23894E+01 0.47569E+01 0.23942E+01
800.0 0.40878E+01 0.20687E+01   0.41419E+01 0.20920E+01 0.41533E+01 0.20968E+01 0.41620E+01 0.21005E+01
900.0 0.36419E+01 0.18465E+01   0.36847E+01 0.18649E+01 0.36937E+01 0.18687E+01 0.37006E+01 0.18716E+01
1000.0 0.32843E+01 0.16677E+01  0.33192E+01 0.16826E+01 0.33264E+01 0.16857E+01 0.33320E+01 0.16880E+01
EOD

# fit columns in a loop and put fit values into array
set fit nolog
do for [i=1:8] {
    fit f(x) $Data u 1:i+1 via a0,a1
    arr0[i] = a0
    arr1[i] = a1
} 

set key Left
plot for [i=1:8] $Data u 1:i+1 ti sprintf("%d: a0=%.1f, a1=%.1f",i,arr0[i],arr1[i]), \
     for [i=1:8] tmp=(a0=arr0[i],a1=arr1[i]) f(x) w l lc rgb "red" not
     
### end of code

谢谢你,先生,我已经将创建数据的部分更改为#为[x=200:1000]{line=sprintf(“%g”,x/1”)创建一些随机测试数据。为[I=1:8]{a0=arr0[I]a1=arr1[I]line=line.sprintf(“%.3f”,f(x/1.)+10*I)}打印行}在循环中设置print#fit列,并将fit值放入数组,并提到我的test.data文件,但我遇到了一个错误“第18行:未定义变量:a0”,其中第18行是“print line”“。我已发布了我的test.data文件。您必须删除带有
$数据的块,我不明白。这些点是你的数据。。。拟合曲线为红线。但拟合值a0、a1被放入数据点的图例中。批次测试数据“u 1:2 w l lw 2 lt 1非”,测试数据“u 1:3 w l lw 2 lt 1 dt非”,测试数据“u 1:4 w l lw 2 lt 2非”,测试数据“u 1:5 w l lw 2 lt 2 dt非”,测试数据“u 1:6 w l lw 2 lt 3非”,测试数据“u 1:7 w l lw 2 lt 3 dt非”,测试数据“非,测试数据”U1:8WLW2LT4NOT,“测试数据”U1:9WLW2LT4DT“-”不适用于[i=1:8]tmp=(a0=arr0[i],a1=arr1[i])f(x)WLPPS0.5 not。你回复二中的修改脚本对我有效。唯一的问题是我想使“for[I=1:8]tmp=(a0=arr0[I],a1=arr1[I])f(x)w p ps 0.5中的点颜色与线颜色不一致。例如,对于1:2和1:3,我需要点颜色作为lt 1,对于1:4和1:5,我需要点颜色作为lt 2,1:6和1:7,我需要点颜色作为lt 3,对于1:8和1:9,我需要点颜色作为lt 4。