'적합 그룹'에서 '이변량'을 '그래프 빌더'로 교체안녕하세요 커뮤니티 여러분!
오랫동안 저는 적합한 그룹에서 이변량 플롯을 그리는 스크립트를 다음과 같이 사용했습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
여기서 중요한 점은 문자열 목록 형태로 매개변수 목록을 얻은 다음 이를 하나씩 표시한다는 것입니다.
이제 Graph Builder에는 있고 Bivariate에는 없는 일부 기능 때문에 Bivariate Plot에서 Graph Builder로 전환해야 합니다.
Graph Builder 플롯을 Bivariate처럼 보이게 하는 방법을 알아냈지만, 위와 같이 Fit Group에 GB를 그리는 간단한 방법이 있는지 알 수 없습니다. Fit Group은 다음과 같이 GB를 사용할 수 있는 것 같습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
하지만 임의의 매개변수 목록에 대해서는 루프로 스크립트를 작성해야 합니다. 다음과 같이 더 간단한 것을 원했습니다(물론 작동하지는 않겠지만요).
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
GB에서 매개변수 목록을 가져와서 DisplayBox 목록을 출력할 수 있는 방법이 있나요?
자동화 및 스크립팅Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체거의 맞았습니다. 루프 형태로 스크립트를 작성해야 합니다. 아래 코드는 잘 작동하는 것 같습니다. 열 목록을 GUI 출력으로 대체할 수도 있고, GUI 스크립팅에 익숙하지 않다면 '선택된 열 가져오기' 기능을 스크립트로 작성해서 표시할 열을 선택한 후, 프로그래밍 방식으로 목록으로 변환하는 방법도 있습니다.
그래프 빌더의 강점은 상호작용성입니다. 따라서 한 창에 여러 개의 플롯을 표시하는 데는 적합하지 않습니다. 각 플롯을 수정해야 하기 때문입니다(실제로 수정해야 한다고 가정할 경우). 하지만 스크립팅을 사용하면 쉽게(어느 정도) 처리할 수 있습니다.
제가 사용하는 한 가지 방법은 y x x, GB 등 여러 플랫폼으로 출력하는 스크립트를 사용하는 것입니다. 하지만 이 스크립트는 열 전환 기능도 제공합니다. 열 전환기 목록에 있는 각 출력을 저널에 표시하는 버튼이 있습니다. 물론, 상호작용 기능은 없습니다.
어쨌든 약간 수정된 스크립트가 있습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체Graph Builder의 경우 비슷한 효과를 얻으려면 Page를 사용해야 하지만, 이 경우 데이터가 특정 형식이어야 합니다. 또는 열 전환기를 사용할 수도 있습니다.
Page를 사용할 수 없다면 Fit Group 대신 Graph Builder를 사용하는 것을 고려해 보세요. 그래프를 Lineup Box에 모아서 행으로 쉽게 그룹화할 수 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
각 행에 얼마나 많은 보고서가 있는지 변경하려면 Lineup Box를 사용하면 됩니다.
<< N Col(1);
필요한 경우 최상위 개요 상자에 스크립트를 추가할 수 있습니다.
Fit Group을 사용하고 싶으시다면, 사용은 가능하지만 약간의 표현식 처리가 필요합니다. 이 작업을 자주 해야 한다면 함수를 직접 만들어서 처리할 수도 있습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체내가 가지고 있는 제약은 다음과 같습니다.
이 스크립트는 애드인의 일부입니다. 현재는 GUI를 통해 생성된 텍스트 문자열의 열 목록을 입력으로 받습니다.
그리고 저는 상호작용이 필요한 것이 아니라, 고객과 합의한 정확한 줄거리 형식이 필요합니다.
Fit Y by X에서는 오차 막대를 쉽게 표시할 수 없는 것 같아서 GB로 바꾸고 있습니다. 고객이 갑자기 플롯에 오차 막대를 표시해 달라고 하네요.
이 질문은 단일 GB가 아닌 GB 목록을 생성하는 가장 효율적인 방법에 대한 것입니다. Fit Group 및 Fit Y by X와 같은 방식으로 수행할 수 있는 문서화되지 않은 기능을 기대하고 있었습니다.
하지만 루프 스크립트를 작성해야 할 것 같습니다.
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체Line Up Box로 바꿔야 할 것 같아요. 코드 변경이 더 많아질 것 같아서 하고 싶지는 않았지만, 스크립팅 표현식을 정말 좋아하지 않아요. 다만 다음과 같은 점만 바랄 뿐입니다.
1. 나는 이 Fit Group의 특정 기능을 코드의 다른 어느 곳에도 사용하지 않습니다.
2. 출력 결과에서 Fit Group과 똑같은 모양으로 보이게 만들 수 있습니다.
최종 출력의 예시 코드를 보여드리겠습니다.
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체당신에게 질문이 있습니다.
명백한 오타를 수정한 후 스크립트가 완벽하게 작동합니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
그러면 'lub'에 그대로 추가하면 됩니다.
제안하신 첫 번째 스크립트를 약간 다른 모양과 형식으로 다시 썼습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
제 경우에는 'listOfGBs'도 다음과 같이 표시됩니다.
{Graph Builder[], Graph Builder[]}
하지만 온라인에서는:
lub << Append( listOfGBs );
오류가 발생합니다.
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
왜 그런지 아시나요?
좀 더 실험해 보겠지만 GB를 함수로 유지하고 싶습니다.
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체제가 이렇게 하자마자 스크립트가 작동을 멈췄습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
의미적으로는 Graph Builder 표현식을 직접 사용하거나 이를 나타내는 변수를 사용하는 것에 차이가 없어야 한다고 저는 이해했습니다. 그런데 스크립트가 제대로 작동하지 않는 이유는 무엇인가요?
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체알겠습니다. 다음과 같은 형식으로 작동합니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
저는 함수(제 방식)와 표현(사실상 당신의 방식)을 모두 사용할 수 있습니다.
이전 문제가 무엇인지는 모르겠지만 분명히 함수 내부에 LineUp Box를 생성하고 GB 객체 대신 이를 반환해야 합니다.
Re: 'Fit Group'에서 'Bivariate'를 'Graph Builder'로 교체라인업 상자에 그래프 빌더가 아닌 목록을 추가하고 있습니다. 스크립트를 다음과 같이 수정하는 것이 좋습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
그래프를 생성할 때는 약간 주의해야 합니다. 표현식을 조금씩 수정하면 일반적으로 피할 수 있지만, 표현식을 직접 만들어야 합니다. 또한, 참조를 수집할 필요가 없다면 Insert Into가 필요 없으므로 작업이 약간 더 수월해집니다. 나중에 << XPath를 사용하여 참조를 가져올 수 있습니다.
더 보기...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;