web-dev-qa-db-ja.com

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のplot部分をループする方法があるかどうか疑問に思っていました。

75
Slayer

確かにあります(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

互いにオフセットしたい場合。

詳細については、gnuplotコマンドラインで「help iteration」と入力してください。

また、do for構文に関する@DarioPの回答も必ずご覧ください。これにより、従来のforループにより近いものが得られます。

91
andyras

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/

76
DarioP

スクリプトall.pがあります

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

ここで、最後の2行はリテラルであり、ヒューリスティックではありません。それから私は走る

$ gnuplot -p all.p

*.datを使用しているファイルタイプに変更するか、ファイルタイプを追加します。

次のステップ:〜/ .bashrcにこの行を追加します

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

そして、ファイルをall.pをホームディレクトリと出来上がりに入れます。 pと入力して、任意のディレクトリのすべてのファイルをプロットできます。

EDIT動作しなかったため、コマンドを変更しました。以前は、list(i)=Word(system(ls -1B *.dat),i)が含まれていました。

10

グラフにプロットする離散列がある場合は、次を使用します

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

任意のディレクトリから作業しながら、ワイルドカードを使用して、多くの場合異なるディレクトリに配置された複数のファイルをプロットしたかった。私が見つけた解決策は、~/.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ファイルをプロットします。

2

代替コマンドは次のとおりです。

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