gnuplot中的循环结构?


82

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


bash下面
Hastur

Answers:


96

肯定有(在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循环。


感谢您的解决方案“使用1:2标题'Flow'.i'为[i = 1:1000]'data'.i。'。txt'绘制的图形对我有用。.我在Windows上将gnuplot 5.2与C ++一起使用。 ..
MasoodUrRehman

但是我还有另一个问题,我正在编写一个程序,它通过fream K在硬盘上写入K个文件。K是一个全局变量,因此,我想使用gnuplot在我的图形上绘制K个文件[i = 1 :K],但会给出未定义变量的错误。我在外面尝试了gnuplot的循环,但这还是行不通的。
MasoodUrRehman

我在C ++中为gnuplot写了一个与for [i = 1:5]一起使用的函数,但是当我为for [i = 1:K]使用时,它给出了错误...
MasoodUrRehman

@MasoodUrRehman,听起来您可能正在尝试使用gnuplot脚本中C ++代码中的变量;向gnuplot发送命令时,请确保您正在打印变量K的值。Gnuplot之所以说“未定义变量”,是因为C ++知道K是什么,而gnuplot却不知道。如果仍然遇到问题,最好将您的问题作为单独的C ++问题发布。
andyras '17

83

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/


1
我是否还可以使用迭代器t引用数组中的索引,例如文件名或颜色?
tommy.carstensen 2013年

1
我从未尝试过,但是我没有发现任何问题。最终,另一种可能性是直接在方括号中指定数组的项(颜色,名称或其他名称),如图所示help do
DarioP

1
我在这里问了一个新问题stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot,因为这对我来说并不明显,如何实现。
tommy.carstensen 2013年

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)


对我来说,您的代码不起作用。我不得不写list=system(ls -1B *.dat)
Jaxan

嗯好 我在Linux上的版本是4.6。
JonatanÖström'16

1
所以我再次尝试了,正如您所说的那样,它不起作用。我必须在系统调用中使用广告单引号来使您的命令起作用:list=system('ls -1B *.dat')
JonatanÖström2016年

它对我不起作用。带或不带引号。为什么?
萨米拉'17

@samira我不知道。
JonatanÖström'2


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


您可以添加plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }以避免gnuplot没有文件的呼叫。
哈斯图

0

这是替代命令:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.