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

y a-t-il un moyen quelconque de récupérer itérativement des données à partir de plusieurs fichiers et de les tracer sur le même graphique dans gnuplot. Supposons que j'ai des fichiers comme des données1.txt, de données2.txt......data1000.txt; ayant chacun 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 boucler la boucle à travers la partie parcelle dans gnuplot.

74
demandé sur mgilson 2013-02-19 02:32:51

6 réponses

il est certain (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, donc vous pouvez faire quelque chose comme

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

si vous voulez que les lignes soient décalées les unes par rapport aux autres.

Tapez help iteration à la ligne de commande de gnuplot pour plus d'information.

n'oubliez pas non plus la réponse de @DarioP sur la syntaxe do for ; cela vous donne quelque chose plus proche d'une boucle traditionnelle for .

85
répondu andyras 2017-02-03 16:04:48

regardez aussi la commande do { ... } depuis gnuplot 4.6 car elle est très puissante:

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 /

73
répondu DarioP 2013-07-26 14:53:40

j'ai le script en entier.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, pas heuristiques. Puis je cours

$ gnuplot -p all.p

changez *.dat pour le type de fichier que vous avez, ou ajoutez des types de fichiers.

prochaine étape: Ajouter à ~/.bashrc cette ligne 151970920"

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

et mettez votre fichier all.p dans votre répertoire personnel et voilà. Vous pouvez tracer tous les fichiers dans le répertoire en tapant p et entrez.

MODIFIER j'ai changé la commande, car il ne fonctionnait pas. Auparavant, il contenait list(i)=word(system(ls -1B *.dat),i) .

8
répondu Jonatan Öström 2016-01-21 00:30:10

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 était de 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 '' $arg,"
        shift
done
echo "$str" | gnuplot -persist
}

et l'utiliser par exemple comme plo *.dat ../../dir2/*.out , pour tracer tous les fichiers .dat dans le répertoire courant et tous les fichiers .out dans un répertoire qui se trouve être un niveau supérieur et est appelé dir2 .

1
répondu Jonatan Öström 2016-01-21 01:24:05

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
répondu kenorb 2018-02-13 14:29:26

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 ;  
}
0
répondu Amit Ruhela 2018-05-13 22:53:35