gnuplot: Variablenwerte und Definitionen im Plotbefehl

Sep 24 2020

Ich bin gerade über Folgendes gestolpert:

Gemäß dem Gnuplot-Handbuch kann ein Plotelement eine Definition enthalten.

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>}

Überprüfen Sie das folgende Beispiel:

  • Für das erste Diagramm y=x+1wird geplottet, weil a=1es zuvor definiert wurde. Wie erwartet.

  • Für das zweite Diagramm und den ersten Plotbefehl sollte es dasselbe sein, y=2*x+1wird jedoch stattdessen (zweimal) geplottet.

  • Wenn im dritten Diagramm a=1explizit angegeben wird, wird es wie erwartet dargestellt.

Warum ignoriert Gnuplot a=1das zweite Diagramm? Habe ich etwas falsch verstanden?

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

Ergebnis:

Antworten

4 Ethan Sep 24 2020 at 11:29

Ihre Diagnose ist leicht falsch. Im zweiten Feld wird das erste violette Diagramm mit dem a = 3-Diagramm und nicht mit dem a = 2-Diagramm überlagert.

Warum? Weil Gnuplot alle Elemente des gesamten Diagramms sammelt, bevor eines davon tatsächlich gezeichnet wird. Dies beinhaltet zwei Durchgänge über die Befehlszeile. Ein Durchgang zum Parsen und Laden von Daten aus den genannten Datenquellen (z. B. für die automatische Skalierung erforderlich), dann ein zweiter Durchgang zum Auswerten von Funktionen über den Bereich (der möglicherweise durch die automatische Skalierung ermittelt wurde). Während des ersten Durchgangs wird a auf 2 und dann auf 3 gesetzt. Zu Beginn des zweiten Durchgangs ist a immer noch 3 und in Ermangelung einer anfänglichen Definition, um es zu ändern, wird dies verwendet, wenn f (x) ausgewertet wird .