gnuplot中的循环结构?

gnuplot中的循环结构?,gnuplot,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" usi

是否有任何方法可以迭代地从多个文件中检索数据,并在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+中):

变量
i
可以解释为变量或字符串,因此您可以执行以下操作

plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i
如果要使线彼此偏移

有关更多信息,请在gnuplot命令行中键入
help iteration


还要确保看到@DarioP关于
do for
语法的答案;这使您更接近于传统的
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
}

我的脚本是all.p

set ...
...
list=system('ls -1B *.dat')
plot for [file in list] file w l u 1:2 t file
这里最后两行是文字,不是启发式的。然后我就跑

$ gnuplot -p all.p
*.dat
更改为您拥有的文件类型,或添加文件类型

下一步:添加到~/.bashrc此行

alias p='gnuplot -p ~/./all.p'
然后把你的文件
all.p
放到你的主目录,瞧。通过键入p并输入,可以打印任何目录中的所有文件


EDIT我更改了命令,因为它不起作用。以前,它包含
list(i)=word(system(ls-1B*.dat),i)

我想使用通配符绘制多个文件,这些文件通常放在不同的目录中,同时从任何目录进行工作。我找到的解决方案是在
~/.bashrc

plo () {
local arg="w l"
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

下面是另一个命令:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'

如果要在图形中绘制离散列,请使用以下命令

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}

我还可以使用迭代器t引用一个数组中的索引,例如文件名或颜色吗?我从未尝试过,但我看不出有任何问题。最后,另一种可能是直接在方括号中指定数组的项(颜色、名称或其他),如
帮助所示。我在这里问了一个新问题,因为我不清楚如何实现。对我来说,你的代码不起作用。我不得不写
list=system(ls-1B*.dat)
而不是.Hm,好的。我使用的是Linux上的4.6版本,所以我又尝试了一次,正如你所说,它不起作用。我必须在系统调用中使用ad单引号才能让您的命令工作:
list=system('ls-1B*.dat')
我不工作。带引号或不带引号。为什么?@samira我不知道。真的很舒服
bash
函数,你可以在中添加
plo(){[$#-eq 0]&&echo“Usage plo file1 file2…”
,以避免在没有文件的情况下调用
gnuplot
。感谢你的解决方案“plot for[I=1:1000]”数据“.I..txt”使用1:2标题“Flow”。我为我工作过。。我在Windows上使用C++的GnUpTrand 5.2…但是我还有一个问题,我正在编写一个程序,它通过FRAMAM k将硬盘上的K个文件写入一个全局变量,所以,我想用GnU情节来绘制k个文件,我尝试用[i=1:k],但是它给出了未定义变量的错误。我尝试从GnUrgt中循环,但也不适用。我在C++中为GnUrgt编写了一个函数,用于[i= 1:5],但是当我使用[i=1:k]时,它给出了错误…@ MasoDururrHman。听起来好像你在GnUrPro脚本中试图从C++代码中使用变量;确保在向gnuplot发送命令时打印变量K的值。Gnuplot说“未定义变量”是因为C++知道K是什么,但是GNUTRAP不知道。如果你仍然被困,最好把你的问题作为一个单独的C++问题来发布。这里只提供一个例子,说明如何循环非连续的数字。
do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}