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.
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
.
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
}
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)
.
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
.
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'
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 ;
}