JSL Scripters の皆さん、こんにちは。
グラフに独自の凡例を追加するスクリプトを作成中です。下のスクリーンショットをご覧ください。

グラフ上で右クリックして「カスタマイズ」→「スクリプトを追加」を選択し、線とテキストを追加しました。以下のJSLスクリプトは、上記のような凡例を生成します。
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" );
しかし、私が本当に知りたいのは、凡例の行とテキストの位置を、例えば列「Weight diff [g]」の最大値の90%を基準にする方法です。データテーブルとスクリプトも添付されています(動作しないスクリプトはコメントアウトされています)。Eval(Substitute(Expr(...), Expr(__pos__), pos) のようなJSLでできると思ったのですが、「Invalid Matrix Token」エラーが繰り返し発生します。以下のようなコードです。
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 ) )
)
);
Line() の y 座標を "{ }" で囲んで、Line( [20, 100],[{_pos__,__pos__}]) のようにしてみましたが、やはり同じエラーが発生します。列の値は変化する可能性があり、線やテキストなどのグラフオブジェクトがグラフ化されているものに対して相対的に移動できるようにする必要があるため、絶対値として扱うのではなく、列から取得した "pos" のような変数を使用したいのです。
このエラーを回避する方法、あるいは私が何か見落としている点について何かご提案があれば教えてください。この方法はうまくいくはずなのですが、なぜうまくいかないのかが分かりません。
ありがとう!、
DS
こんにちは、 @jthi さん。
ヒントをありがとうございました!少し修正しただけで、とても助かりました。まさに私が求めていたものが手に入りました。本当に感謝しています!
迅速なご返信ありがとうございます!
DS
他の読者の方にも参考になるかもしれないので、JSLコード(下記参照)を以下のように修正しました。
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" );
)}
)
)
);
これにより、以下の出力が得られます。

これらはまさに私がやりたかったこと、つまりグラフの全長や全高に及ばない相対的な「凡例」や特定の参照線を作成することの実例です。
これが、同様のことをしようとしている他の人たちのお役に立てば幸いです。
これが他の人の役に立てば幸いです!
DS
グラフィックスクリプトに対してx1とy2を評価することで、様々な厄介な問題を回避することができるかもしれません。
もっと見る...
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
)
);