web-dev-qa-db-fra.com

Structure de boucle à l'intérieur de gnuplot?

Existe-t-il un moyen de récupérer de manière itérative les données de plusieurs fichiers et de les tracer sur le même graphique dans gnuplot. Supposons que j'ai des fichiers tels que data1.txt, data2.txt ...... data1000.txt; chacun ayant le même nombre de colonnes. Maintenant je pourrais écrire quelque chose comme-

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"

Mais ce serait vraiment gênant. Je me demandais s'il y avait un moyen de parcourir en boucle la partie plot de gnuplot.

75
Slayer

Il existe bien (dans gnuplot 4.4+):

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

La variable i peut être interprétée comme une variable ou une chaîne, vous pouvez donc faire quelque chose comme

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

si vous voulez avoir des lignes décalées les unes des autres.

Tapez help iteration sur la ligne de commande gnuplot pour plus d’informations.

Assurez-vous également de voir la réponse de @ DarioP à propos du do for syntaxe; cela vous donne quelque chose de plus proche d'une boucle traditionnelle for.

91
andyras

Jetez également un coup d'œil au do { ... } commande depuis gnuplot 4.6 car il est très puissant:

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

J'ai le script all.p

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

Ici, les deux dernières lignes sont littérales et non heuristiques. Puis je cours

$ gnuplot -p all.p

Remplacez *.dat Par le type de fichier que vous avez ou ajoutez des types de fichiers.

Prochaine étape: Ajouter à ~/.bashrc cette ligne

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

et mettez votre fichier all.p dans votre répertoire personnel et le tour est joué. Vous pouvez tracer tous les fichiers de n'importe quel répertoire en tapant p et entrer.

EDIT J'ai changé la commande, car cela ne fonctionnait pas. Auparavant, il contenait list(i)=Word(system(ls -1B *.dat),i).

10
Jonatan Öström

Utilisez ce qui suit si vous avez des colonnes discrètes à tracer dans un graphique

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

Je voulais utiliser des caractères génériques pour tracer plusieurs fichiers souvent placés dans des répertoires différents, tout en travaillant à partir de n'importe quel répertoire. La solution que j'ai trouvée consistait à créer la fonction suivante dans ~/.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
}

et l'utiliser par exemple comme plo *.dat ../../dir2/*.out, pour tracer tous les .dat fichiers dans le répertoire en cours et tous les .out fichiers dans un répertoire de niveau supérieur appelé dir2.

2
Jonatan Öström

Voici la commande alternative:

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