[RESOLU] [gnuplot] gif animation : points statiques

Le problème exposé dans ce sujet a été résolu.

Bonjour !

J’ai épluché google et la documentation gnuplot je trouve pas de solutions

en gros je suis entrain de faire un gif avec la fonction : set term gif animate delay 5

j’ai plusieurs trucs à tracer sur mon graph et j’aimerai que certains points/courbes restent sur l’image quelque soit la frame

je suis sur que cette option existe mais impossible de trouver

C’est la première fois que je poste ici donc hésitez pas à me dire si un truc va pas, Merci et bisous

+0 -0

Bonjour Mihro et bienvenue sur le forum,

Je ne vais pas répondre à ta question mais ce site le fera sûrement : gnuplotting

C’est une mine d’or pour tout ce qui concerne gnuplot et le lien te montrera notamment quelques exemples d’animations.

Si tu as encore des soucis, n’hésite pas à nous poster un exemple minimal que nous puissions te débugger.

Bonjour, merci pour ta réponse j’avais déjà consulté ce site mais j’ai fait chou blanc .

Je vais vous montrez ce que je veux faire ce sera plus simple, voilà mon script :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
reset
set term gif animate delay 5
set output "output.gif"
stats 'filout.txt' name "A" nooutput
stats 'radar.txt' name "B" nooutput
set xrange [-50:1150]
set yrange [-50:300]
p=1

f(x) = a*x**2 + b*x + c
a = 0.1
b = 0.1
c = 0.1
fit f(x) 'radar.txt' via a, b, c

do for [i=1:int(A_blocks)] {
  plot 'filout.txt' index (i-1)

  if ((i-1)/30>=(p-1)) {
    plot 'radar.txt' index (p-1)
    p=p+1
    }

  if (i>=600) {
    plot f(x)
    }
}  

`

Mon objectif est que, à partir de certains i dans ma boucle les points du fichier ’radar.txt’ reste sur le graph quelque soit la frame jusqu’à la fin. De même pour f(x), il faudrait qu’elle apparaisse et reste sur le graph à partir de 600 itérations.

Les points de ’filout.txt’ doivent continuer à changer chaque frame ( seule chose qui marche jusqu’à présent )

Si quelqu’un a une solution je suis preneur, je continue de chercher de mon côté et je vous tiens au jus.

Merci et bisous

Bonjour et merci pour ton code.

Attention aux plot successifs dans ta boucle : le tracé de l’un va écraser le précédent. Si tu veux superposer plusieurs courbes il faut faire appel à multiplot (on l’utilise plutôt pour mettre plusieurs graphes côte à côte), ou enchaîner les courbes à la suite d’une seule commande plot. Par exemple :

1
plot f(x), 'data.dat'

tracera la fonction f et les données contenues dans data.dat sur un même graphe.

Ensuite tu utilises index qui te permet de sélectionner un bloc de données en particulier via la variable i ou p. L’option every te permet en fait un contrôle plus fin, par exemple de spécifier où démarrer dans tes données, où t’arrêter et l’incrément si tu veux sauter des points. Pour ’radar.txt’, si on oublie la condition pour le moment, je ferais :

1
plot 'radar.txt' every :::0::i

ce qui trace ’radar.txt’ du bloc 0 au bloc i.

Passons aux conditions. Tu peux faire des if(){} else if() {} avec les courbes souhaitées pour chaque condition. Personnellement j’aime bien les opérateurs ternaires, ça donne un code un peu plus compact. Le code suivant devrait te donner le comportement que tu attends :

16
17
18
19
20
21
22
23
24
25
26
27
seuilFonction = 600
seuilRadar = 30

# Une fonction g pour définir quand on a le droit de tracer f 
# 1/0 signifie valeur non définie pour gnuplot
g(x,y)= y>=seuilFonction ? f(x) : 1/0

do for [i=0:int(A_blocks)-1] {
      plot 'filout.txt' every :::i::i,\
           'radar.txt' using ($1):(i>=seuilRadar ? $2 : 1/0) every ::0::(i>=seuilRadar ? ii-30 : 0),\
            g(x,i)
}

On trace ’filout.txt’ point par point à chaque frame, puis on trace ’radar.txt’ une fois que i vaut seuilRadar (j’ai rajouté l’option using ... pour éviter le tracé du premier point) et enfin on fait appel à g(x,y) qui prend en charge le tracé de f une fois que i a atteint la bonne valeur.

Pardon si c’est dense et si je n’ai pas compris le comportement que tu souhaitais pour ton script mais je pense en tout cas t’avoir montré pas mal de possibilités. Pour finir fais attention à tes fichiers de données : sont-ils bien sous forme de blocs ? Si ce n’est pas le cas (tous les points se suivent sans lignes blanches), il te suffira de modifier la limite de ta boucle en int(A_records)-1 et d’adapter les options every (par exemple every ::i::i pour ’filout.txt’).

Voilà en esperant avoir pu t’aider, et puisque tu as l’air d’y tenir, la bise :)

Bonjour, merci beaucoup pour votre réponse détaillée grâce à laquelle j’ai réussi à faire ce que je voulais. Je poste la solution si quelqu’un a une demande similaire.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
reset
set term gif animate delay 5
set output "output.gif"
stats 'filout.txt' name "A" nooutput
stats 'radar.txt' name "B" nooutput
set xrange [-50:1150]
set yrange [-50:300]
seuilFonction = 5000*cos(pi/4)/20
f(x) = a*x**2 + b*x + c
p=0
a = 0.1
b = 0.1
c = 0.1
fit f(x) 'radar.txt' via a, b, c
g(x,y) = y>=seuilFonction ? f(x) : 1/0
do for [i=0:int(A_blocks)-1] {
      plot 'filout.txt' index (i), 'radar.txt' every ::0::(i*2*B_records/A_blocks), g(x,i)
}
set output

Sujet résolu :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte