For loop Gnuplot循环拟合、统计和绘图

For loop Gnuplot循环拟合、统计和绘图,for-loop,gnuplot,For Loop,Gnuplot,我很难让我的gnuplot脚本正常工作。基本上,我有六个数据文件,我想在同一个文件中绘制它们,并适合每个数据集 它变得有点复杂,因为我必须在绘图之前重新格式化数据。为此,我使用了stats命令。问题就在这里。最后一个打印命令包含一个执行数据格式化的for循环。每个stats命令生成带有前缀Potentiali的统计数据,其中i从1到6 现在我的问题是,如何在plot循环中访问这个运行索引 这是我的剧本: #!/bin/bash gnuplot << EOF set termina

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

它变得有点复杂,因为我必须在绘图之前重新格式化数据。为此,我使用了
stats
命令。问题就在这里。最后一个打印命令包含一个执行数据格式化的
for
循环。每个
stats
命令生成带有前缀
Potentiali
的统计数据,其中
i
从1到6

现在我的问题是,如何在plot循环中访问这个运行索引

这是我的剧本:

#!/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
#/bin/bash

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


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

如果有人有时间调查,我将不胜感激,因为我目前正接近最后期限。如果您删除不必要的代码并专注于问题,这将非常有用,因此任何愿意提供帮助的用户都不会感到气馁。这是一个以某种方式相关的问题(),您可以将值存储在列表中,然后使用
word()
函数访问元素。我知道,我通常不会发布这种质量的问题,但我真的很着急。我稍微整理了一下我的剧本。希望这会有帮助。如果你真的很忙,我的建议是只序列化你的脚本。不要在
for
循环中执行操作,而是复制并粘贴相关的
统计数据
行六次,并更改所需内容,然后
绘制“/path/Shift\u 1/potential.dat”。保持循环可能需要像@Miguel提到的那样摆弄
word()
,或者
eval
,这将引导你走上一条黑暗而扭曲的道路……这应该很容易。一开始就考虑过,但遇到这些问题后就没有考虑过。这是一个丑陋的剧本,但我想我已经不在乎了。
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