Hallo JSL-Skripter,
Ich arbeite an einem Skript, mit dem ich einem Diagramm eine eigene Legende hinzufüge. Siehe Screenshot unten.

Ich habe die Linien und den Text hinzugefügt, indem ich mit der rechten Maustaste im Diagramm auf „Anpassen…“ geklickt und dann ein Skript zum Diagramm hinzugefügt habe. Der folgende JSL-Code generiert die Legende wie oben dargestellt.
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( [20, 100], [65, 65] );
Text( {120, 64}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( [20, 100], [60, 60] );
Text( {120, 59}, "Height" );
Aber eigentlich möchte ich wissen, wie ich die Positionen der Legendenlinien und des Textes relativ zu z. B. 90 % des Maximalwerts in der Spalte „Gewichtsdifferenz [g]“ festlegen kann. Die Datentabelle ist zusammen mit dem Skript beigefügt (das nicht funktionierende Skript ist auskommentiert). Ich dachte, ich könnte das mit einer JSL-Funktion wie `Eval(Substitute(Expr(...), Expr(__pos__), pos)` lösen, erhalte aber immer die Fehlermeldung „Ungültiges Matrix-Token“. Mit folgendem Code:
Names Default To Here( 1 );
pos = Col Max( :"Weight diff[g]"n );
Eval(
Substitute(
Expr(
Graph Builder(
Size( 510, 510 ),
Show Legend( 0 ),
Graph Spacing( 4 ),
Variables(
X( :"MeasTime [s]"n ),
Y( :"Weight diff [g]"n ),
Y( :"Height diff [mm]"n, Position( 1 ), Side( "Right" ) )
),
Elements( Line( X, Y( 1 ), Legend( 5 ) ), Line( X, Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "MeasTime [s]", ScaleBox, {Inc( 100 )} ),
Dispatch( {}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description( "" ),
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( [20, 100], [__pos__, __pos__] );
Text( {120, 64}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( [20, 100], [60, 60] );
Text( {120, 59}, "Height" );
)}
)
)
)
),
Expr( __pos__ ), Eval( Round( 0.9 * pos, 0 ) )
)
);
Ich habe sogar versucht, die y-Koordinaten der `Line()`-Funktion in geschweifte Klammern zu setzen, etwa so: `Line( [20, 100],[{_pos__,__pos__}])`, aber ich erhalte immer noch denselben Fehler. Ich würde lieber eine Variable wie `pos` verwenden, die ich aus einer Spalte erhalte, anstatt einen absoluten Wert zu verwenden, da sich die Spaltenwerte ändern können und die Diagrammobjekte wie Linie und Text sich relativ zum dargestellten Objekt bewegen können müssen.
Hat jemand Vorschläge, wie ich diesen Fehler umgehen kann und/oder was ich übersehe? Dieser Ansatz sollte eigentlich funktionieren, aber ich verstehe einfach nicht, warum.
Danke!,
DS
Hallo @jthi ,
Danke für den Tipp! Mit einer kleinen Anpassung hat das sehr geholfen und mir genau das gebracht, was ich brauchte, danke!
Vielen Dank auch für die schnelle Antwort!
DS
Falls es andere Leser interessiert, habe ich den JSL-Code (siehe unten) wie folgt geändert:
Names Default To Here( 1 );
x1=300;
y2=36.7;
Graph Builder(
Size( 510, 510 ),
Show Legend( 0 ),
Graph Spacing( 4 ),
Variables( X( :"MeasTime [s]"n ), Y( :"Weight diff [g]"n ), Y( :"Height diff [mm]"n, Position( 1 ), Side( "Right" ) ) ),
Elements( Line( X, Y( 1 ), Legend( 5 ) ), Line( X, Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "MeasTime [s]", ScaleBox, {Inc( 100 )} ),
Dispatch( {}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description( "" ),
Pen Color( "Black" );
Line Style( "Dashed" );
Line( {x1,YOrigin()}, {x1,y2}, {XOrigin(),y2}, {x1,y2} );
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( {XOrigin()+30, 0.9*YRange()}, {XOrigin()+130, 0.9*YRange()} );
Text( {XOrigin()+150, 0.9*YRange()-1}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( {XOrigin()+30, 0.85*YRange()}, {XOrigin()+130, 0.85*YRange()} );
Text( {XOrigin()+150, 0.85*YRange()-1}, "Height" );
)}
)
)
);
Dies führt zu folgender Ausgabe:

Dabei handelt es sich um Demonstrationen genau dessen, was ich erreichen wollte – relative „Legenden“ und spezifische Bezugslinien zu erstellen, die nicht über die gesamte Länge/Höhe des Diagramms verlaufen.
Hoffentlich hilft dies anderen, die etwas Ähnliches vorhaben.
Ich hoffe, das hilft anderen!
DS
Um allerlei potenziell lästige Probleme zu vermeiden, sollten Sie die x1- und y2-Werte im Grafikskript auswerten.
Mehr anzeigen...
Names Default To Here(1);
x1 = 300;
y2 = 36.7;
dt = Current Data Table();
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Size(510, 510),
Show Legend(0),
Graph Spacing(4),
Variables(X(:"MeasTime [s]"n), Y(:"Weight diff [g]"n), Y(:"Height diff [mm]"n, Position(1), Side("Right"))),
Elements(Line(X, Y(1), Legend(5)), Line(X, Y(2), Legend(6))),
SendToReport(
Dispatch({}, "MeasTime [s]", ScaleBox, {Inc(100)}),
Dispatch({}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description(""),
Pen Color("Black");
Line Style("Dashed");
Line({_x1_, Y Origin()}, {_x1_, _y2_}, {X Origin(), _y2_}, {_x1_, _y2_});
Pen Color("Red");
Pen Size(2);
Line Style("Solid");
Line({X Origin() + 30, 0.9 * Y Range()}, {X Origin() + 130, 0.9 * Y Range()});
Text({X Origin() + 150, 0.9 * Y Range() - 1}, "Weight");
Pen Color("Blue");
Pen Size(2);
Line({X Origin() + 30, 0.85 * Y Range()}, {X Origin() + 130, 0.85 * Y Range()});
Text({X Origin() + 150, 0.85 * Y Range() - 1}, "Height");
)}
)
)
)),
Expr(_x1_), x1,
Expr(_y2_), y2
)
);