여러분 모두에게,
얼마 전에 작성한 스크립트를 업데이트하고 있습니다. 원본 스크립트/아이디어를 찾을 수 있습니다. 여기 . 원본 스크립트는 사용자가 현재 데이터 테이블의 "열 선택" 패널 상자에 나열된 열을 클릭할 때 일부 기본 통계 정보를 업데이트하기 위한 것이었습니다.
지금 하고 싶은 것은 사용자가 현재 데이터 테이블에서 사용할 수 있는 다른 열을 클릭할 때 업데이트되는 일부 패널 상자를 추가하는 것입니다. 열 내 데이터의 분포를 보여주는 패널 상자를 업데이트하고 싶습니다. 실제로 배포 플랫폼의 결과(가능한 경우)를 표시하고 그래프 작성기 또는 그래프 상자를 생성하는 것이 아닙니다. 다른 하나는 이상값 탐색 플랫폼의 결과를 보여주는 패널 상자입니다. 사용자가 검토할 새 열을 선택할 때 이 두 패널 상자가 모두 업데이트되기를 바랍니다.
"Big Class.jmp" 예제 데이터 파일을 사용하여 보여주고 싶은 작은 목업을 만들었습니다. 맨 끝에 JSL을 포함했습니다.
이것은 사용자 인터페이스의 현재 보기입니다.

이것은 누군가가 관심 있는 열(이 경우 :height)을 클릭할 때 표시되는 방식에 대한 개념입니다.

그런 다음 사용자가 새 열(예: weight)을 클릭하면 디스플레이가 업데이트되고 다음과 같이 표시됩니다.

분포 플랫폼에서 요약 통계는 실제로 필요하지 않지만 박스 플롯과 그 위에 그래프로 표시된 데이터 포인트가 있는 분포와 평균, 중앙값 및 최대 50%와 같은 박스 플롯의 추가 정보가 필요합니다. 데이터 -- 예를 들어 그래프 빌더에서 쉽게 추가할 수 없습니다.
저를 위해 이 문제를 완전히 해결할 필요는 없지만 시작하는 방법에 대한 제안이 있으면 정말 감사하겠습니다. 지금까지 시도한 아이디어가 작동하지 않기 때문입니다. 이것이 가능한지 조차 모르지만, 나는 그것이 가능하기를 바라고 있습니다. 대시 보드로 수행하지 않는 것이 좋습니다.
도움을 주셔서 미리 감사드립니다! 아래는 JSL입니다.
감사해요!,
DS
//GUI for quickly reporting statistics written by D. Schmidt, ver2.0
//Thanks to JMP User community members: jthi, ian_jmp, and ErraticAttach for helpful suggested changes.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 200;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"µ", "σ", "Max", "Min", "Range(Δ)", "N"};
StatsList2 = {"µ", "Median", "Mode", "N"};
StatsList3 = {"Quantiles", "5%", "25%", "50%", "75%", "95%", "Int. Q. Range"};
StatsList4 = {"N", "N Missing", "N 0", "Prop 0", "Prop non-0"};
maxStatCount = Max( N Items( StatsList1 ), N Items( StatsList2 ), N Items( StatsList3 ), N Items( StatsList4 ) );
//RadioBox() arguments
rbArg = Eval List(
{Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " ), Concat Items( StatsList4, ", " )}
);
rbcArg = {"Select for categorical columns"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statMed = Expr( Col Median( tempCol ) );
statMode = Expr(
Mode( dt:tempcol << getvalues )
);
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statIntQR = Expr( StatQ25 - StatQ75 );
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
OrdStats = Expr(
colmodeltype = tempCol << Get Modeling type;
If( colmodeltype == "Ordinal",
orddist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_orddist = orddist << Report;
ordlvl = rpt_orddist[String Col Box( 1 )] << Get;
ordCount = rpt_orddist[Number Col Box( 1 )] << Get;
ordProb = rpt_orddist[Number Col Box( 2 )] << Get;
OrdSummNMiss = rpt_orddist[List Box( 7 )][2] << Get Text;
OrdSummLvl = rpt_orddist[List Box( 8 )][1] << Get text;
OrdnumNMiss = Num( OrdSummNMiss );
OrdnumLvl = Num( OrdSummLvl );
Orddist << Close Window;
);
Insert Into( Ordlvl, {"N Missing", "N Levels"} );
Insert Into( OrdCount, OrdnumNMiss );
Insert Into( OrdCount, OrdnumLvl );
);
CatStats = Expr(
coltype = tempCol << Get Data type;
If( coltype == "Character",
catdist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_catdist = catdist << Report;
lvl = rpt_catdist[String Col Box( 1 )] << Get;
Count = rpt_catdist[Number Col Box( 1 )] << Get;
Prob = rpt_catdist[Number Col Box( 2 )] << Get;
SummNMiss = rpt_catdist[List Box( 7 )][2] << Get Text;
SummLvl = rpt_catdist[List Box( 8 )][1] << Get text;
numNMiss = Num( SummNMiss );
numLvl = Num( SummLvl );
catdist << Close Window;
);
Insert Into( lvl, {"N Missing", "N Levels"} );
Insert Into( Count, numNMiss );
Insert Into( Count, numLvl );
);
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3, StatsList4} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {statMean, statMed, statMode, statN} )
);
StatListRes3 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5, StatIntQR} )
);
StatListRes4 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3, StatListRes4} )
);
//Expression to handle the distribution platform
DistExpr = Expr(
Distribution(
Continuous Distribution(
Column( tempCol ),
Quantiles( 0 ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Customize Summary Statistics( N Zero( 1 ) )
),
SendToReport( Dispatch( tempCol, "Summary Statistics", OutlineBox, {Close( 1 )} ) )
)
);
//Expression for Outliers
OutlierExpr = Expr(
Explore Outliers( Y( tempCol ), Quantile Range Outliers)
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
몇 가지 아이디어가 떠오릅니다.
- 크기가 있는 스페이서 상자를 사용하여 분포를 저장하고 이상값을 탐색하는 상자를 표시하도록 특정 크기를 강제합니다. 사용자가 관심 있는 열로 변경하는 경우 -> 이전 분포를 삭제하고 이상값을 탐색하고 동일한 위치로 다시 만듭니다(여기에서 추가가 작동해야 함).
- 숨겨진 열 전환기를 사용하고 사용자가 열 목록을 변경할 때 열 선택 업데이트
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
eo = dt << Explore Outliers(
Y(:weight),
Quantile Range Outliers
);
cs_eo = eo << Column Switcher(
:weight,
{:weight, :height}
);
(Report(eo) << top parent)[Outline Box("Column Switcher")] << Visibility("Collapse");
wait(1);
cs_eo << Set Current("height");
wait(1);
cs_eo << Set Current("weight");안녕 @jthi ,
사실 좋은 제안을 받을 줄 알았기 때문에 답장을 해주기를 바랐습니다. 감사합니다!
귀하의 제안은 제가 찾고 있던 것과 정확히 일치하지는 않았지만 제가 원하는 변경을 수행하는 방법에 대한 몇 가지 좋은 아이디어를 제공했습니다. 결국 <
누군가 관심이 있는 경우를 대비하여 아래 코드를 포함하고 있습니다. 이 작업을 수행하는 다른 방법이 있다고 확신하지만 이것은 여러 다른 유형의 데이터 파일에 적용할 수 있을 만큼 충분히 일반적이었으므로 지금은 만족합니다.
감사해요!,
DS
//GUI for quickly reporting statistics written by D. Schmidt, ver2.1<BR />//Thanks to JMP User community members: jthi, ian_jmp, and ErraticAttach for helpful suggested changes.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 200;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"µ", "σ", "Max", "Min", "Range(Δ)", "N"};
StatsList2 = {"µ", "Median", "Mode", "N"};
StatsList3 = {"Quantiles", "5%", "25%", "50%", "75%", "95%", "Int. Q. Range"};
StatsList4 = {"N", "N Missing", "N 0", "Prop 0", "Prop non-0"};
maxStatCount = Max( N Items( StatsList1 ), N Items( StatsList2 ), N Items( StatsList3 ), N Items( StatsList4 ) );
//RadioBox() arguments
rbArg = Eval List(
{Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " ), Concat Items( StatsList4, ", " )}
);
rbcArg = {"Select for categorical columns"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statMed = Expr( Col Median( tempCol ) );
statMode = Expr(
Mode( dt:tempcol << getvalues )
);
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statIntQR = Expr( StatQ25 - StatQ75 );
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
OrdStats = Expr(
colmodeltype = tempCol << Get Modeling type;
If( colmodeltype == "Ordinal",
orddist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_orddist = orddist << Report;
ordlvl = rpt_orddist[String Col Box( 1 )] << Get;
ordCount = rpt_orddist[Number Col Box( 1 )] << Get;
ordProb = rpt_orddist[Number Col Box( 2 )] << Get;
OrdSummNMiss = rpt_orddist[List Box( 7 )][2] << Get Text;
OrdSummLvl = rpt_orddist[List Box( 8 )][1] << Get text;
OrdnumNMiss = Num( OrdSummNMiss );
OrdnumLvl = Num( OrdSummLvl );
Orddist << Close Window;
);
Insert Into( Ordlvl, {"N Missing", "N Levels"} );
Insert Into( OrdCount, OrdnumNMiss );
Insert Into( OrdCount, OrdnumLvl );
);
CatStats = Expr(
coltype = tempCol << Get Data type;
If( coltype == "Character",
catdist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_catdist = catdist << Report;
lvl = rpt_catdist[String Col Box( 1 )] << Get;
Count = rpt_catdist[Number Col Box( 1 )] << Get;
Prob = rpt_catdist[Number Col Box( 2 )] << Get;
SummNMiss = rpt_catdist[List Box( 7 )][2] << Get Text;
SummLvl = rpt_catdist[List Box( 8 )][1] << Get text;
numNMiss = Num( SummNMiss );
numLvl = Num( SummLvl );
catdist << Close Window;
);
Insert Into( lvl, {"N Missing", "N Levels"} );
Insert Into( Count, numNMiss );
Insert Into( Count, numLvl );
);
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3, StatsList4} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {statMean, statMed, statMode, statN} )
);
StatListRes3 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5, StatIntQR} )
);
StatListRes4 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3, StatListRes4} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>