我很难让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
答案 0 :(得分:2)
在较新的gnuplot版本中,使用do for
构造创建一个包含所需值的字符串,然后使用word()
函数选择所需的值。如果您的变量是a1
,a2
和a3
(在您的特定情况下更改为名称),请执行以下操作:
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
您需要根据自己的目的调整上述代码。