JSL을 사용하여 그래프에 대한 요소 문을 동적으로 추가하는 방법안녕하세요 여러분, 저는 JMP와 JSL은 처음이지만 코딩에는 꽤 익숙합니다. "PlotVars" 배열에 정의된 매개변수 이름 목록을 받아서 같은 그래프에 각각 별도의 플롯으로 표시하는 JSL 스크립트를 만들려고 합니다. 배열에 정의된 매개변수의 개수에 관계없이 이 스크립트가 작동하도록 하고 싶습니다(매개변수를 사용할 때마다 매개변수를 추가하거나 제거하려는 경우를 대비해서). 아래 코드를 사용하여 스크립트에서 이 스크립트를 생성할 수 있지만, 모든 플롯은 기본적으로 점을 사용하는데, 저는 대신 선을 사용하고 싶습니다. 제가 알기로는 각 위치에 여러 개의 요소 명령문을 사용하는 것이 이 작업을 수행하는 방법입니다. 문제는 두 번째 줄에서 "var_line" 변수를 초기화하는 데 있는 것 같습니다. Expr()로 초기화하면 요소 명령문은 생성되지만 제대로 실행되지 않습니다. Parse()로 초기화해도 마찬가지입니다. 이 문제를 해결할 수 있는 아이디어가 있다면 공유해 주세요. 저는 JMP 18을 사용하고 있습니다.
편집(jthi): jsl 포맷 추가
var_expr = Expr(
Variables(X(As Column("Start Alignment of " || DataSet_1)))
);
var_line = Expr();//Unable to dymanically add elements to the graph. still unsure why
For(i = 1, i <= N Items(PlotVars), i++,
Insert Into(var_expr, Eval Expr(Y(As Column(PlotVars[Expr(i)] || " of " || DataSet_1), )));
Insert Into(
var_expr,
Eval Expr(Y(As Column(PlotVars[Expr(i)] || " of " || DataSet_2), Position(Expr(i)), ))
);
Insert Into(
var_line,
Eval Expr(Elements(Position(1, Expr(i)), Line(X, Y(1), Y(2)), Legend(4)))
);
);
plot = Substitute(
Expr(
Data Table("Comparison of" || DataSet_1 || "with" || DataSet_2) <<
Graph Builder(Size(809, 629), Show Control Panel(0), vvv, yyy)
),
Expr(vvv), Name Expr(var_expr),
Expr(yyy), Name Expr(test)
);
Eval(plot);
<
var_expr = Expr(변수(X(열("DataSet_1의 시작 정렬 " || DataSet_1) )));
var_line = Expr();//그래프에 동적으로 요소를 추가할 수 없습니다. 이유는 아직 확실하지 않습니다.
i=1, i<=N 항목(PlotVars),i++,
Into(var_expr, Eval Expr(Y( as column(PlotVars[expr(i)] || " of " || DataSet_1),)));를 삽입합니다.
Into(var_expr, Eval Expr(Y( as column(PlotVars[expr(i)] || " of " || DataSet_2), Position(expr(i)),)));를 삽입합니다.
var_line, Eval Expr(Elements(Position(1,expr(i)),Line(X,Y(1),Y(2)),Legend(4))));에 삽입합니다.
);
플롯 = 대체(
표현(
데이터 테이블( "|| DataSet_1 || "와" || DataSet_2의 비교) <<
그래프 빌더(
크기( 809, 629 ),
제어판 표시( 0 ),
관광 안내소,
년
)),
Expr(vvv), 이름 Expr(var_expr),
Expr(yyy), 이름 Expr(test)
);
평가(플롯);
>
자동화 및 스크립팅Re: JSL을 사용하여 그래프에 대한 요소 문을 동적으로 추가하는 방법그래프를 어떤 모양으로 만들고 싶으신가요? JMP에서 생성된 스크립트는 어떤 모습인가요? JSL로 만든 스크립트와 비교하면 어떤가요?
Data Table("Comparison of" || DataSet_1 || "with" || DataSet_2) <<
Graph Builder(
Size(809, 629),
Show Control Panel(0),
Variables(
X(As Column("Start Alignment of " || DataSet_1)),
Y(As Column(PlotVars[1] || " of " || DataSet_1)),
Y(As Column(PlotVars[1] || " of " || DataSet_2), Position(1)),
Y(As Column(PlotVars[2] || " of " || DataSet_1)),
Y(As Column(PlotVars[2] || " of " || DataSet_2), Position(2))
),
test
)
동적으로 구축되는 그래프 빌더와 관련된 자료도 꽤 많습니다. 스크립터 클럽 녹화 영상 몇 가지를 소개합니다: 그래프 빌더의 JSL , 모두에게 답글: 그래프 빌더에서 동적 콘텐츠를 스크립팅하는 방법
Re: JSL을 사용하여 그래프에 대한 요소 문을 동적으로 추가하는 방법스크립트는 제가 원하는 대로 그래프를 정확히 생성하지만, element 명령문에서 points/smoother를 사용하여 그래프를 생성합니다(스크립트 길이를 줄이기 위해 변수는 제거되었습니다). 스크립트 출력에서 가져온 그래프 코드는 다음과 같습니다.
Graph Builder(
Size( 809, 629 ),
Show Control Panel( 0 ),
Variables(
...
)
),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Y( 2 ), Legend( 1 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 2 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 4 ) )
),
Elements(
Position( 1, 3 ),
Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) )
),
Elements(
Position( 1, 4 ),
Points( X, Y( 1 ), Y( 2 ), Legend( 7 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 8 ) )
),
Elements(
Position( 1, 5 ),
Points( X, Y( 1 ), Y( 2 ), Legend( 9 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 10 ) )
)
);
그리고 저는 대신 Lines를 사용하는 것을 선호합니다.
Graph Builder(
Size( 696, 590 ),
Show Control Panel( 0 ),
Variables(
...
)
),
Elements( Position( 1, 1 ), Line( X, Y( 1 ), Y( 2 ), Legend( 11 ) ) ),
Elements( Position( 1, 2 ), Line( X, Y( 1 ), Y( 2 ), Legend( 12 ) ) ),
Elements( Position( 1, 3 ), Line( X, Y( 1 ), Y( 2 ), Legend( 13 ) ) ),
Elements( Position( 1, 4 ), Line( X, Y( 1 ), Y( 2 ), Legend( 14 ) ) ),
Elements( Position( 1, 5 ), Line( X, Y( 1 ), Y( 2 ), Legend( 15 ) ) )
);
elements 문에 "Insert Into"를 시도할 때마다 별도의 elements 문 대신 중첩된 elements 문만 추가됩니다. 그리고 그래프 빌더는 중첩된 elements 문을 무시하는 것 같습니다.
Re: JSL을 사용하여 그래프에 대한 요소 문을 동적으로 추가하는 방법
더 보기...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
plotvars = {"NPN1", "NPN2", "NPN3", "NPN4", "PNP1"};
xcol = "wafer";
gb_expr = Expr(Graph Builder(Size(809, 629), Show Control Panel(0)));
var_expr = EvalExpr(Variables(X(Expr(NameExpr(As Column(dt, xcol))))));
For Each({colname, idx}, plotvars,
Insert Into(var_expr, Eval Expr(Y(Expr(NameExpr(As Column(dt, colname))))));
);
Insert Into(gb_expr, Name Expr(var_expr));
For(idx = 1, idx <= N Items(plotvars), idx++,
elem_expr = Substitute(
Expr(Elements(Position(1, _pos_), Line(X, Y, Legend(_lgnd_)))),
Expr(_pos_), idx,
Expr(_lgnd_), idx
);
Insert Into(gb_expr, Name Expr(elem_expr));
);
// Show(gb_expr);
gb = Eval(EvalExpr((Send(dt, Expr(gb_expr)))));
gb_expr = Graph Builder(
Size(809, 629),
Show Control Panel(0),
Variables(X(:wafer), Y(:NPN1), Y(:NPN2), Y(:NPN3), Y(:NPN4), Y(:PNP1)),
Elements(Position(1, 1), Line(X, Y, Legend(1))),
Elements(Position(1, 2), Line(X, Y, Legend(2))),
Elements(Position(1, 3), Line(X, Y, Legend(3))),
Elements(Position(1, 4), Line(X, Y, Legend(4))),
Elements(Position(1, 5), Line(X, Y, Legend(5)))
);
Re: JSL을 사용하여 그래프에 대한 요소 문을 동적으로 추가하는 방법이 아이디어가 정말 잘 먹혔네요. 그래프 빌더 수준에서 Elements 명령을 삽입하기만 하면 됐지, elements 명령을 따로 표현식에 넣을 필요는 없었습니다.