将多个文件的数据和拟合函数绘制成一个图

时间:2015-05-11 20:11:40

标签: gnuplot

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

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

我应该说我在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

1 个答案:

答案 0 :(得分:1)

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