Gnuplot循环拟合,统计和绘图

时间:2014-09-29 15:07:59

标签: for-loop gnuplot

我很难让gnuplot脚本工作。基本上,我有六个数据文件,我想在同一个文件中绘制它们,适合每个数据集。

它有点复杂,因为我必须在绘图之前重新格式化数据。为此我使用stats命令。这就是问题所在。最终的绘图命令包含一个for循环,在其中完成数据格式化。每个stats命令都会生成前缀为Potentiali的统计数据,其中i从1到6。

现在我的问题是,如何在绘图循环中访问此运行索引?

这是我的剧本:

#!/bin/bash

gnuplot << EOF

set terminal epslatex color size 16cm,11cm
set output "strain-energy.tex"

set xrange [-10:10]
set yrange [0:*]


fstr(N) = sprintf('f%d(x) = a%d*x**7 + b%d*x**6 + c%d*x**5 + d%d*x**4 + e%d*x**3 + f%d*x**2 + g%d*x + h%d', N, N, N, N, N, N, N, N, N)
eval(fstr(1))

fitstr(N) = sprintf('set fit quiet; fit [-10:10] f%d(x) ''/path/Shift_%d/potential.dat'' every ::1 using (\$1-Potential%d_pos_min_y):(\$2-Potential%d_min_y) via a%d,b%d,c%d,d%d,e%d,f%d,g%d,h%d', N, N, N, N, N, N, N, N, N, N, N, N)

do for [i=1:6] {
    stats "/path/Shift_".i."/potential.dat" every ::1 using (\$1):(\$2) prefix "Potential".i nooutput
    eval(fstr(i))
    eval(fitstr(i))
}

plot for [i=1:6] "/path/Shift_".i."/potential.dat" every ::1 using (100*((\$1-Potential.i._pos_min_y)/Potential_pos_min_y)):(1000*(\$2-Potential_min_y)) ls i title "\\\footnotesize{C".i."}", f1(x) ls 1, f2(x) ls 2, f3(x) ls 3, f4(x) ls 4, f5(x) ls 5, f6(x) ls 6

set output
EOF

1 个答案:

答案 0 :(得分:2)

在较新的gnuplot版本中,使用do for构造创建一个包含所需值的字符串,然后使用word()函数选择所需的值。如果您的变量是a1a2a3(在您的特定情况下更改为名称),请执行以下操作:

a1=1.1; a2=2.2; a3=3.3 # Values
a="" # a is the string where all the values are stored
do for [i=1:3] {eval "a = sprintf(\"%s %g\", a, a".i.")"} # Print a1, etc. to a
print a # Just check what a looks like
  1.1 2.2 3.3
a(i) = real(word(a,i)) # Create function that depends on i
print a(1) # Check that a(1) indeed gives a1
 1.1

您需要根据自己的目的调整上述代码。