98 votes

Structure de boucle dans gnuplot ?

Existe-t-il un moyen de récupérer itérativement les données de plusieurs fichiers et de les tracer sur le même graphique dans gnuplot. Supposons que j'ai des fichiers comme 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 n'y avait pas un moyen de faire une boucle à travers le fichier parcelle dans gnuplot.

0 votes

Vraiment confortable bash dans le réponse ci-dessous

115voto

andyras Points 6906

Il existe bien sûr (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 de caractères, donc vous pourriez faire quelque chose comme

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

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

Type help iteration à la ligne de commande de gnuplot pour plus d'informations.

0 votes

Merci, votre solution "plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i" a fonctionné pour moi. J'utilise gnuplot 5.2 avec C++ sur Windows.....

0 votes

Mais j'ai un autre problème, j'écris un programme qui écrit le nombre K de fichiers sur le disque dur à partir de fream K est une variable globale donc, je veux tracer le nombre K de fichiers sur mon graphique en utilisant gnuplot J'ai essayé for[i = 1:K] mais cela donne une erreur de variable non définie. J'ai essayé de sortir de la boucle for de gnuplot mais cela ne fonctionne pas non plus.

0 votes

J'ai écrit une fonction en C++ pour gnuplot qui fonctionne avec for[i = 1:5] mais quand j'utilise for[i = 1:K] cela donne une erreur...

96voto

DarioP Points 1350

Jetez également un coup d'œil à la 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/

2 votes

Puis-je également utiliser l'itérateur t pour faire référence à un index dans un tableau de noms de fichiers ou de couleurs, par exemple ?

1 votes

Je n'ai jamais essayé mais je n'y vois aucun problème. Finalement, l'autre possibilité est de spécifier les éléments du tableau (couleurs, noms ou autres) directement dans les crochets, comme dans l'exemple suivant help do .

1 votes

J'ai posé une nouvelle question ici stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot parce que la manière d'y parvenir ne me paraît pas évidente.

11voto

Jonatan Öström Points 767

J'ai le script tout.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. Ensuite, j'exécute

$ gnuplot -p all.p

Changement *.dat au type de fichier que vous avez, ou ajouter des types de fichiers.

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

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 de n'importe quel répertoire en tapant p et enter.

EDITAR J'ai changé la commande, car ça ne marchait pas. Auparavant, elle contenait list(i)=word(system(ls -1B *.dat),i) .

0 votes

Pour moi, votre code ne fonctionne pas. J'ai dû écrire list=system(ls -1B *.dat) à la place.

0 votes

Hm, OK. J'étais en version 4.6 sur Linux.

1 votes

J'ai donc réessayé, et comme vous le dites, ça ne marche pas. J'ai dû utiliser des guillemets simples à l'intérieur de l'appel système pour que votre commande fonctionne : list=system('ls -1B *.dat')

11voto

Amit Ruhela Points 191

Utilisez les éléments suivants 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 votes

Le seul exemple fourni ici montre comment boucler des nombres non consécutifs.

2voto

Jonatan Öström Points 767

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 a été de créer la fonction suivante dans le fichier ~/.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 dans le répertoire courant et tous les fichiers .out dans un répertoire qui se trouve être un niveau au-dessus et qui s'appelle dir2 .

0 votes

Vous pouvez ajouter plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } } pour éviter d'appeler gnuplot sans fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X