솔루션 나와 결합 @txnelson 이전에 제공된 점/매끄러움 등을 수정할 수 있어야 합니다. 먼저 JMP를 사용하여 그래프를 만듭니다(y축에 모든 열이 있을 필요는 없으며 두 개만 사용할 수 있음). 이 스크립트를 개발하는 과정을 살펴보겠습니다(약간 길 것입니다).
1. JMP 샘플 데이터를 엽니다. 이 경우에는 Semiconductor Capability.jmp에 많은 열이 있다는 것을 알고 있습니다.
2. 일부 열을 X축으로, 두 개를 Y축으로 하여 그래프 빌더에서 그래프를 생성합니다.

스크립트를 가져 가라
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
)
3. 점을 선으로 변경하고 요약 통계도 기본값에서 변경하므로 스크립트에서 어떻게 변경되는지 볼 수 있습니다.

스크립트 가져오기
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
)
4. 이제 이 작업을 시작하기에 아주 좋은 기본 스크립트가 있습니다. 내가 알기 때문에 Re: 표현식 문자열을 작성하지 않고 이것을 구성할 수 있습니까? 이 문제를 해결하는 데 사용할 수 있으므로 이를 기준으로 사용합니다(이전에 제공한 스크립트).
기본 그래프:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);
이제 점 대신 선을 사용하려면 JMP가 이전에 제공한 "선" 스크립트에서 무엇을 변경해야 하는지 확인해야 합니다. 기본적으로 요소를 추가해야 합니다.
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
다행이 다른 글에 추가되었습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
var_line = Expr(Line(X));
For Each({col, idx}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
yline_expr = Parse("Y("||char(idx)||")");
Insert Into(var_line, Name Expr(yline_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
Elements(yyy)
)
),
Expr(vvv), Name Expr(var_expr),
Expr(yyy), Name Expr(var_line)
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);

(요약 통계를 변경하지 않았지만 그래프 빌더를 생성하기 전에 var_line에 몇 가지 표현식을 더 삽입하여 변경하는 것이 상당히 쉬울 것입니다)
yline_expr = Expr(Legend(6));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />yline_expr = Expr(Summary Statistic("Median"));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />
Expr, Substitute, NameExpr 등을 사용하는 방법을 알고 커뮤니티에서 이 두 개의 게시물을 통해 배웠습니다. Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 한 표현식을 다른 표현식에 삽입 , 표현식 처리 함수: 1부 - Expr(), NameExpr(), Eval(), ... 수수께끼 그리고 수많은 시행착오를 겪었습니다(나는 여전히 그것들과 혼동합니다. 특히 Name Expr의 경우)
마지막으로, 이 스크립트를 가지고 있는 스크립트와 결합한다면(더 정리하고, 표현식의 순서를 변경하고, 열 선택기를 미리 채우고 사용할 그래프 유형을 선택하는 옵션을 제공할 수 있지만 이렇게 해야 합니다. 아이디어):
더보기...
Names Default To Here(1);
//the data table you want to operate on
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//number of columns in the data table
numcol = N Col(dt);
selectorwindow = New Window("Column Selector",
<<MODAL></MODAL>
마치 생성한 대화형 그래프 빌더를 가져온 다음 JMP가 그래프를 생성할 JSL을 생성하도록 하는 대신 Python 프로그래머가 하는 것처럼 처음부터 JSL을 생성하는 것처럼 들립니다.아래 그래프를 대화식으로 생성하면

빨간색 삼각형으로 이동하고 "스크립트"를 선택하면 두 Y축 변수를 모두 처리하는 스크립트가 생성됩니다.
Graph Builder(
Size( 528, 448 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y( :height ), Y( :weight, Position( 1 ) ) ),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
5,
Base( 0, 0, 0, Item ID( "height", 1 ) ),
Base( 1, 0, 0, Item ID( "weight", 1 ) )
)}
)
)
);
이제 문제가 위와 같은 스크립트를 사용하고 필요한 만큼의 Y 열을 처리하도록 확장하려고 할 때 때때로 약간 더 많은 작업이 필요할 수 있다는 것입니다.
다음은 동일한 그래프 구조이지만 더 많은 Y 열이 있습니다.

JMP가 그래프를 재생성하기 위해 생성한 확장 JSL은 다음과 같습니다.
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
여기서 JSL 프로그래머는 Graph Builder에 전달하기 위해 실행할 명령 문자열을 생성해야 합니다.이미 이 작업을 수행 중이고 그래프에서 첫 번째 Y 변수만 가져오는 경우 일반적으로 발생하는 일은 그래프 빌더가 전달되는 정보를 평가할 수 없다는 것입니다.사용 중인 JSL을 제공하면 커뮤니티에서 일반적으로 도움을 주는 데 능숙합니다.
다음 주제가 도움이 될 수 있습니다.
Re: 표현식 문자열을 작성하지 않고 이것을 구성할 수 있습니까?
여기에 많은 표현식이 있으며 << Get picture를 사용하여 그래프 빌더에서 "기능을 제거"할 수도 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);