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


回答:


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コマンドラインで入力してください。

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


あなたの解決策に感謝します "plot for [i = 1:1000] 'data'.i。'。txt'using 1:2 title 'Flow'.i"は私のために働きました..私はWindowsでC ++でgnuplot5.2を使用しています。 ..
MasoodRehman 2017

しかし、別の問題があります。フリーム経由でハードディスクにK個のファイルを書き込むプログラムを作成しています。Kはグローバル変数なので、試したgnuplotを使用してグラフにK個のファイルをプロットしたいと思います[i = 1 :K]しかし、未定義の変数のエラーが発生します。gnuplotからforループの外で試しましたが、それも機能しません。
MasoodRehman 2017

for [i = 1:5]で動作するgnuplot用の関数をC ++で作成しましたが、for [i = 1:K]を使用すると、エラーが発生します...
MasoodRehman 2017

@MasoodUrRehmangnuplotスクリプトでC ++コードの変数を使用しようとしているようです。gnuplotにコマンドを送信するときは、変数Kの値を出力していることを確認してください。C ++はKが何であるかを知っているが、gnuplotは知らないため、gnuplotは「未定義の変数」と言っています。それでも問題が解決しない場合は、別のC ++質問として問題を投稿することをお勧めします。
andyras 2017

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.gnuplating.org/gnuplot-4-6-do/


1
イテレータtを使用して、ファイル名や色などの配列内のインデックスを参照することもできますか?
tommy.carstensen 2013

1
試したことはありませんが、問題はありません。最終的には、に示すように、配列の項目(色、名前など)を角かっこで直接指定することもできますhelp do
darioP 2013

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

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

$ gnuplot -p all.p

*.datお持ちのファイルタイプに変更するか、ファイルタイプを追加してください。

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

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

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

編集それが機能しなかったので、私はコマンドを変更しました。以前はが含まれていましたlist(i)=word(system(ls -1B *.dat),i)


私にとってあなたのコードは機能しません。私はlist=system(ls -1B *.dat)代わりに書かなければなりませんでした。
Jaxan 2016年

うーん、わかりました。Linuxではバージョン4.6を使用していました。
はJonatanオストロム

1
だから私はそれをもう一度試しました、そしてあなたが言うようにそれはうまくいきません。コマンドを機能させるには、システムコール内で一重引用符を使用する必要がありました。list=system('ls -1B *.dat')
JonatanÖström 2016年

それは私にはうまくいきません。引用符の有無にかかわらず。どうして?
samira 2017

@samiraわかりません。
はJonatanオストロム

5

グラフにプロットする離散列がある場合は、以下を使用してください

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

1
ここで提供されている唯一の例は、連続していない番号をループする方法を示しています。
rehctawrats 2018年

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ます。
Hastur 2016

0

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

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.