各位JSL腳本編寫者,大家好!
我正在編寫一個腳本,目的是在圖表中添加自訂“圖例”。請參考下方截圖。

我透過在圖表中右鍵單擊,選擇“自訂...”>,然後向圖表添加腳本,添加了線條和文字。以下 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" );
但我真正想要的是如何讓圖形例行和文字的位置相對於「重量差異 [g]」列中的最大值(例如 90%)進行調整。資料表和腳本也已附上(無法執行的腳本已註解掉)。我原本以為可以用類似 Eval(Substitute(Expr(...), Expr(__pos__), pos) 的 JSL 函數來實現,但我一直收到「無效矩陣標記」的錯誤。例如,我嘗試了以下程式碼:
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
)
);