87

有什么方法可以迭代地从多个文件中检索数据并将它们绘制在 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 中的情节部分。

4

6 回答 6

101

肯定有(在 gnuplot 4.4+ 中):

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

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

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

如果你想让线条相互偏移。

help iteration在 gnuplot 命令行中键入以获取更多信息。

还请务必查看@DarioP 对do for语法的回答;这给你一些更接近传统for循环的东西。

于 2013-02-18T23:18:19.490 回答
90

看看do { ... }自 gnuplot 4.6 以来的命令,因为它非常强大:

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/

于 2013-07-26T14:53:40.450 回答
10

我有脚本 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 并回车来绘制任何目录中的所有文件。

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

于 2015-01-30T15:32:06.613 回答
8

如果您有要在图表中绘制的离散列,请使用以下内容

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}
于 2018-05-13T22:53:35.590 回答
2

我想使用通配符来绘制通常放置在不同目录中的多个文件,同时从任何目录工作。我找到的解决方案是在~/.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

于 2016-01-21T01:24:05.533 回答
1

这是替代命令:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
于 2018-02-13T14:29:26.220 回答