2014-09-29 64 views
1

我很难让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 
+0

我真的很感激,如果有人有时间研究这个,因为我正在接近最后期限。 – Casimir 2014-09-29 16:43:27

+1

如果您删除了不必要的代码并专注于问题,这将有所帮助,因此任何愿意帮助的用户都不会灰心。这是一个相关的问题(http://stackoverflow.com/questions/23671742/preventing-gnuplot-from-evaluating-function-for-each-data-point),你可以将你的值存储在一个列表中,然后访问使用'word()'函数的元素。 – Miguel 2014-09-29 18:02:59

+0

我知道,我通常不会发布这种质量的问题,但我真的很匆忙。我清理了一下我的剧本。希望有所帮助。 – Casimir 2014-09-29 18:21:18

回答

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 

你需要上面的代码适应你的目的。