안녕하세요, 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%에 상대적으로 맞추는 방법입니다. 데이터 테이블과 스크립트도 첨부했습니다(작동하지 않는 스크립트는 주석 처리했습니다). JSL의 Eval(Substitute(Expr(...), Expr(__pos__), pos) 같은 구문을 사용하면 될 거라고 생각했는데, 계속해서 "잘못된 행렬 토큰" 오류가 발생합니다. 다음과 같은 코드를 사용해 봤습니다.
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
)
);