Gnuplot içindeki döngü yapısı?


82

Birden fazla dosyadan yinelemeli olarak veri almanın ve bunları gnuplot'ta aynı grafikte çizmenin herhangi bir yolu var mı? Data1.txt, data2.txt ...... data1000.txt gibi dosyalarım olduğunu varsayalım; her biri aynı sayıda sütuna sahip. Şimdi şöyle bir şey yazabilirim-

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"

Ancak bu gerçekten sakıncalı olacaktır. Gnuplot'ta olay örgüsü kısmında döngü yapmanın bir yolu olup olmadığını merak ediyordum .


Gerçekten rahat bashişlevi cevap aşağıda
Hastur

Yanıtlar:


96

Elbette (gnuplot 4.4+ sürümünde):

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

Değişken i, değişken veya dize olarak yorumlanabilir, böylece

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

satırların birbirinden uzak olmasını istiyorsanız.

Tip help iterationfazla bilgi için gnuplot komut satırına.

Ayrıca @ DarioP'nin do forsözdizimi hakkındaki yanıtını gördüğünüzden emin olun ; bu size geleneksel bir fordöngüye daha yakın bir şey verir .


"Plot for [i = 1: 1000]" plot for [i = 1: 1000] 'data'.i.'. Txt '1: 2 başlık' Flow '.i "benim için çalıştı. Windows'ta C ++ ile gnuplot 5.2 kullanıyorum .. ..
MasoodRehman

Ama başka bir problemim daha var, sabit diske Fream K üzerinden K sayıda dosya yazan bir program yazıyorum K global bir değişken, bu yüzden, [i = 1 için denediğim gnuplot kullanarak grafiğime K sayıda dosya çizmek istiyorum : K] ancak tanımsız değişken hatası veriyor. Gnuplot'tan dışarıda for loop denedim ama bu da çalışmıyor.
MasoodRehman

Gnuplot için C ++ 'da [i = 1: 5] için çalışan bir işlev yazdım ama [i = 1: K] için kullandığımda hata veriyor ...
MasoodRehman

@MasoodUrRehman Gnuplot betiğinizde C ++ kodunuzdan bir değişken kullanmaya çalışıyor olabilirsiniz; gnuplot'a komutlar gönderirken K değişkeninin değerini yazdırdığınızdan emin olun. Gnuplot, 'tanımlanmamış değişken' diyor çünkü C ++ K'nin ne olduğunu biliyor, ancak gnuplot bilmiyor. Hâlâ takıldıysanız, sorununuzu ayrı bir C ++ sorusu olarak göndermek iyi olabilir.
andyras

83

do { ... }Gnuplot 4.6'dan beri çok güçlü olduğu için komuta da bir göz atın :

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
Örneğin dosya adları veya renklerden oluşan bir dizideki bir dizine başvurmak için yineleyiciyi kullanabilir miyim?
tommy.carstensen

1
Hiç denemedim ama bunda bir sorun görmüyorum. Sonunda diğer olasılık, dizinin öğelerini (renkler, adlar veya her neyse), gösterildiği gibi doğrudan köşeli parantezler içinde belirtmektir help do.
DarioP

1
Burada stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot için yeni bir soru sordum , çünkü bana göre bunun nasıl başarılabileceği açık değil.
tommy.carstensen

10

Bende all.p

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

Burada son iki satır, sezgisel değil gerçek anlamındadır. Sonra koşarım

$ gnuplot -p all.p

Sahip *.datolduğunuz dosya türünü değiştirin veya dosya türleri ekleyin.

Sonraki adım: Bu satıra ~ / .bashrc ekleyin

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

ve dosyanızı all.pana dizininize ve işinize yerleştirin . P yazıp enter ile herhangi bir dizindeki tüm dosyaları çizebilirsiniz.

EDIT İşe yaramadığı için komutu değiştirdim. Daha önce içeriyordu list(i)=word(system(ls -1B *.dat),i).


Benim için kodunuz çalışmıyor. Onun list=system(ls -1B *.dat)yerine yazmak zorunda kaldım .
Jaxan

HM tamam. Linux'ta 4.6 sürümündeydim.
Jonatan

1
Ben de tekrar denedim ve dediğiniz gibi işe yaramıyor. Komutunuzun çalışması için sistem çağrısı içinde tek tırnak kullanmak zorunda kaldım:list=system('ls -1B *.dat')
Jonatan Öström

benim için çalışmıyor. tırnak işareti içeren veya içermeyen. neden?
samira

@samira bilmiyorum.
Jonatan Öström

5

Bir grafikte çizmek için ayrı sütunlarınız varsa aşağıdakileri kullanın

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

1
Ardışık olmayan sayılar arasında nasıl döngü yapılacağını gösteren tek örnek burada verilmiştir.
rehctawrats

2

Herhangi bir dizinden çalışırken, genellikle farklı dizinlere yerleştirilmiş birden çok dosyayı çizmek için joker karakterler kullanmak istedim. Bulduğum çözüm, aşağıdaki işlevi oluşturmaktı.~/.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
}

ve bunu, örneğin , geçerli dizindeki tüm dosyaları ve bir dizindeki tüm dosyaları bir seviye yukarı olan ve çağrılan plo *.dat ../../dir2/*.outtüm .datdosyaları çizmek için kullanın ..outdir2


plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }Dosyasız arama yapmamak için ekleyebilirsiniz gnuplot.
Hastur

0

İşte alternatif komut:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.