2014-07-22 1 views
2

Après un peu de peaufinage à une parcelle GNU existante, j'ai réussi à obtenir ce qui suit:comment puis-je créer un point animé, étiqueté suivant une trajectoire dans gnuplot?

reset 

# png 
set terminal png size 350,262 enhanced font 'Verdana,10' 

# color definitions 
set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 2 # --- blue 

unset key 
set border 0 
unset tics 
# set view 342,0 
set xrange [-300:300] 
set yrange [-300:300] 

n=0 
do for [ii=1:99] { 
    n=n+1 
    set output sprintf('png/spiral%03.0f.png',n) 
    plot '1_1910.txt' every ::1::ii w l ls 1, \ 
    '2_1910.txt' every ::1::ii w l ls 1 
} 

do for [ii=1:99] { 
    n=n+1 
    set output sprintf('png/spiral1%03.0f.png',n) 
    plot '1_1920.txt' every ::1::ii w l ls 1, \ 
    '2_1920.txt' every ::1::ii w l ls 1 
} 

L'idée est de créer un ensemble de fichiers PNG, puis les concaténer tous avec animation.

Je les concaténer tous ensemble en utilisant

convert -delay 2 -loop 0 png/*.png animation.gif 

Je veux faire plus de réglages:

  1. Je ne veux pas garder la ligne qui suit la parcelle (même si animée) . Au lieu de cela, je veux un "point de balle" (peut-être la taille de 5-10 pixels) avec le texte se déplaçant à côté de lui pour chaque image pour chaque point de données dans le tracé. Je veux un texte en bas à droite pour le premier ensemble de cadres (dans la première boucle 1:99) et un texte différent le remplaçant, encore une fois dans le coin inférieur droit (dans la boucle suivante 1:99) .

Mon code est basé sur ce point:

http://www.gnuplotting.org/animation-iv-trajectory/

, mais je ne peux pas comprendre pourquoi son code a une « piste » qui disparaît, et pourquoi il a aussi un point de balle et Je ne. Comme je l'ai dit, je veux aussi du texte qui bouge avec le point de balle (même texte pour chaque fichier de données).

Répondre

1

Je pense que vous pouvez le faire avec des boucles comme celui-ci:

n = 0 
do for [ii=0:60] { 
    n=n+1 
    set output sprintf('png/spiral%03.0f.png',n) 
    plot 'data.dat' every ::ii::ii w p ls 1, \ 
    'data.dat' using 1:2:("foo") every ::ii::ii w labels offset 2 
} 

set label 1 "hyde" at 275,-275 

do for [ii=60:0:-1] { 
    n=n+1 
    set output sprintf('png/spiral%03.0f.png',n) 
    plot 'data.dat' every ::ii::ii w p ls 1, \ 
    'data.dat' using 1:2:("foo") every ::ii::ii w labels offset 2 
} 

Voici le résultat:

enter image description here

Vous pouvez jouer avec les offset coordonnées pour positionner le texte de l'étiquette "foo" où tu veux.

Pour modifier la taille du point, modifiez la valeur de ps dans la commande de style de ligne au début de votre script.

Je ne suis pas sûr de savoir quel est le but des deux fichiers différents (1_1910.txt et 2_1920.txt), j'ai donc utilisé le même fichier dans mon exemple. Vous devrez peut-être ajouter à la commande plot si vous tracez deux choses différentes à la fois.

En ce qui concerne vos autres questions, je pense que regarder de près le code dans le example devrait vous donner une idée de ce qui se passe. Dans l'exemple, la plage every ::1::ii trace des points de 1 à ii, donnant une ligne; la plage every ::ii::ii ne représente qu'un point. On notera que les abréviations w l et w p dans l'exemple s'étendent respectivement à with lines et with points.

Dans l'exemple, la ligne disparaît en raison de l'action de la deuxième boucle, qui s'exécute en sens inverse (for [ii=99:1:-1]). Si vous copiez cet exemple, assurez-vous également que vos index sont sur les valeurs correctes (vous pouvez avoir un nombre autre que 99 points de données).Notez également que les index dans gnuplot commencent à 0, donc si la première ligne de votre fichier de données contient des données (pas un en-tête), vous voulez commencer votre boucle à ii=0 au lieu de ii=1.

+0

J'ai besoin de tracer deux fichiers en parallèle, mais pour une raison quelconque lorsque j'ajoute un autre fichier (deux instructions exactes supplémentaires à chaque intrigue, juste avec un nom de fichier différent), j'obtiens une erreur. cela n'arrive pas avec le code original - je peux ajouter autant de fichiers que je veux. des idées pourquoi? – kloop

+0

Je ne peux pas être sûr de voir une partie du code, ou au moins un message d'erreur/une description de ce qui ne va pas. Votre code peut avoir la mauvaise syntaxe de continuation - ', \' à la fin de la ligne de tracé, suivi du nom de fichier (pas de mot-clé 'plot') au début de la ligne suivante. – andyras

+0

merci, c'est très utile. – kloop

0

J'ai presque le même problème ici. J'ai trouvé un hack vraiment sympa! Au lieu de faire plusieurs png, puis les fusionner, vous utilisez simplement set multiplot puis unset multiplot à l'intérieur d'une boucle. Être spécifique je l'ai utilisé de cette façon:

do for [i=0:k] 

{  

    set multiplot 

    plot function1 
    plot function2  
    unset multiplot 

} 

Mais malheureusement, cela ne fonctionnera pas à moins que l'ensemble de données que vous avez est synchronisé !, mais peut encore être résoudre ce en utilisant l'instruction if !. Bonne chance

Questions connexes