gnuplot内的循环结构?

有没有办法从多个文件中迭代检索数据,并将它们绘制在gnuplot中的同一个图上。 假设我有文件data1.txt,data2.txt …… data1000.txt; 每个具有相同的列数。 现在我可以写一些像 –

plot "data1.txt" using 1:2 title "Flow 1", \ "data2.txt" using 1:2 title "Flow 2", \ . . . "data1000.txt" using 1:2 title "Flow 6" 

但是这真的很不方便。 我想知道是否有一种方法来循环通过gnuplot的情节部分。

肯定是(在gnuplot 4.4+):

 plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i 

variablesi可以被解释为一个variables或一个string,所以你可以做类似的事情

 plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i 

如果你想有线彼此偏移。

在gnuplot命令行inputhelp iteration获取更多信息。

另外请务必查看@ DarioP关于语法的解答。 这让你更接近传统for循环。

从gnuplot 4.6开始,请看一下do { ... }命令,因为它非常强大:

 do for [t=0:50] { outfile = sprintf('animation/bessel%03.0f.png',t) set output outfile splot u*sin(v),u*cos(v),bessel(u,t/50.0) w pm3d ls 1 } 

http://www.gnuplotting.org/gnuplot-4-6-do/

我有脚本all.p

 set ... ... list=system('ls -1B *.dat') plot for [file in list] file wlu 1:2 t file 

这里最后两行是文字,而不是启发式的。 然后我跑

 $ gnuplot -p all.p 

*.dat更改为您拥有的文件types,或添加文件types。

下一步:添加到〜/ .bashrc这一行

 alias p='gnuplot -p ~/./all.p' 

并把你的文件all.p int你的主目录,瞧。 您可以通过inputp并input来绘制任何目录中的所有文件。

编辑我改变了命令,因为它没有工作。 以前它包含list(i)=word(system(ls -1B *.dat),i)

我想使用通配符来绘制多个文件,这些文件通常放在不同的目录中,而从任何目录下工作。 我发现的解决scheme是在~/.bashrc创build以下函数

 plo () { local arg="wl" local str="set term wxt size 900,500 title 'wild plotting' set format y '%g' set logs plot" while [ $# -gt 0 ] do str="$str '$1' $arg," shift done echo "$str" | gnuplot -persist } 

并使用它,例如plo *.dat ../../dir2/*.out ,将当前目录中的所有.dat文件和所有.out文件放在一个名为dir2