Gnuplot 打印数据并将多个文件的功能拟合到一个打印中

Gnuplot 打印数据并将多个文件的功能拟合到一个打印中,gnuplot,Gnuplot,我有N个输入文件,我想将这些文件的数据与它们的拟合函数一起绘制到一个单独的绘图中(即,所有文件、数据和拟合函数的一个绘图) 经过长时间的摆弄,我找到了一个解决方案(见下文),但我发现它“笨重而丑陋”,我想知道是否有更好、更优雅的方法来实现同样的目标 我应该说我在Windows下的gnuplot 5.0上。下面的测试脚本没有指定终端(我正在使用windows和wxt进行测试),但最终的脚本将使用pngcairo终端 我发现我的解决方案存在次优问题: 我需要两个中间表$data和$fit。我最初的

我有N个输入文件,我想将这些文件的数据与它们的拟合函数一起绘制到一个单独的绘图中(即,所有文件、数据和拟合函数的一个绘图)

经过长时间的摆弄,我找到了一个解决方案(见下文),但我发现它“笨重而丑陋”,我想知道是否有更好、更优雅的方法来实现同样的目标

我应该说我在Windows下的gnuplot 5.0上。下面的测试脚本没有指定终端(我正在使用windows和wxt进行测试),但最终的脚本将使用pngcairo终端

我发现我的解决方案存在次优问题:

  • 我需要两个中间表$data和$fit。我最初的尝试是使用do for{}循环依次读取每个文件,执行拟合并生成绘图,但没有成功
  • 我没有使用拟合函数,而是将拟合曲线(在这个简单的例子中是一条直线)作为数据绘制到表中。我尝试使用eval创建即时用户函数,但就是不太明白(尤其是如何使它们与数据保持同步)
  • 我希望拟合方程显示在图表中。我通过设置标签来实现这一点,但如果它只是键的一部分就更好了
我的测试数据:

data1.dat
100 0.15
200 0.29
300 0.46
400 0.58

data2.dat
100 0.12
200 0.22
300 0.35
400 0.48

data3.dat
100 0.1
200 0.22
300 0.29
400 0.40
我的gnuplot脚本:

set key left
set xrange [0:*]
set yrange [0:0.5]

# user function for linear fit
lin(x) = slope * x + offset
max(a,b) = ((a>=b)? a : b)

file_list = "data1 data2 data3"

x_max = 0
# first write all data of interest into a (memory) table
set table $data
do for [name in file_list] {
  filename = name . ".dat"
  plot filename u 1:2
  print ""
  print ""
  x_max = max(GPVAL_DATA_X_MAX, x_max)
}
unset table
x_max = max(GPVAL_DATA_X_MAX, x_max)

num_indices = words(file_list)

# now calculate a linear fit for each dataset
set sample 2
set table $fit
do for [i = 0:(num_indices-1)]{
  fit lin(x) $data index i using 1:2 via slope, offset
  plot [0:x_max][0:0.5] lin(x)
  set label (i+1) sprintf("%s = %.3g*x + %.3g", word(file_list, i+1)."(x) ", slope, offset) at 200,(0.20 - 0.05*i)
}
unset table

set title "Data and Linear Fit"
set xlabel "x"
set ylabel "y"

#now we got both data and fit for all files, plot everything at once
plot for [i = 0:(num_indices-1)] $data index i title word(file_list,i+1) with points lc i+1, for [i = 0:(num_indices-1)] $fit index i with lines lc i+1 noti

总是有愚蠢、野蛮的方式。您可以创建一个包含所有要拟合点的新数据文件(例如,在linux系统中使用“cat data1.dat data2.dat data3.dat>newdata.dat”,然后拟合newdata)。

有关使用
eval
进行拟合的方法,以及使用宏进行打印的
replot
方法,请参阅。这也很难看,但对于这类任务,我没有明确的解决方案。我尝试了你的建议,但似乎无法奏效(见下文)。show plot给了我:
最后一个plot命令是:plot filename,f1(x),filename,f1(x),filename,f1(x)
相关代码如下:
filename=sprintf(“%s.dat”,word(file_list,1))f=sprintf(“f%d(x)”,1)plot filename,@f do for[i=2:num_index]{filename=sprintf(“%s.dat”,word(file_list,i))f=sprintf(“f%d(x)”,i)replot filename,@f}
最近的5.2版本有数组变量,但使用它们进行拟合并不简单。我认为您必须使用一组额外的变量进行拟合,然后将结果值复制到数组中。