gnuplot: valeurs de variables et définitions dans la commande plot

Sep 24 2020

Je viens de tomber sur ce qui suit:

Selon le manuel de gnuplot, un élément de tracé peut contenir une définition.

Syntax: 

      plot {<ranges>} <plot-element> {, <plot-element>, <plot-element>}

Each plot element consists of a definition, a function, or a data source 
together with optional properties or modifiers: 

      plot-element:
           {<iteration>}
           <definition> | {sampling-range} <function> | <data source>
                        | keyentry
           {axes <axes>} {<title-spec>}
           {with <style>}

Vérifiez l'exemple suivant:

  • Pour le premier graphique y=x+1est tracé car a a=1été défini plus tôt. Comme prévu.

  • Pour le deuxième graphique et la première commande de tracé, il devrait être identique mais y=2*x+1est tracé à la place (deux fois).

  • Dans le troisième graphique, lorsque a=1est explicitement spécifié, il est tracé comme prévu.

Pourquoi gnuplot ignore a=1-t-il le deuxième graphique? Ai-je mal compris quelque chose?

Code:

### definitions in plot command
reset session

a = 1
b = 1
f(x) = a*x + b

set yrange[-40:40]
set multiplot layout 1,3
    plot     f(x)
    plot     f(x), a=2 f(x), a=3 f(x)
    plot a=1 f(x), a=2 f(x), a=3 f(x)
unset multiplot
### end of code

Résultat:

Réponses

4 Ethan Sep 24 2020 at 11:29

Votre diagnostic est légèrement erroné. Dans le deuxième panneau, le premier graphique violet est superposé avec le graphique a = 3 plutôt que le graphique a = 2.

Pourquoi? Parce que gnuplot accumule tous les éléments du tracé complet avant d'en dessiner réellement. Cela implique d'effectuer deux passes sur la ligne de commande. Une passe pour analyser et charger les données de toutes les sources de données mentionnées (nécessaire par exemple pour l'autoscaling), puis une deuxième passe pour évaluer toutes les fonctions sur la plage (qui aurait pu être déterminée par l'autoscaling). Lors de la première passe ici, a est mis à 2 puis à 3. Au début de la deuxième passe a est toujours 3 et en l'absence de définition initiale pour le changer c'est ce qui est utilisé lorsque f (x) est évalué .