데이터 테이블 구조를 수정하지 않은 상관 관계 도표첨부된 예제 데이터 테이블에 표시된 대로 서로 다른 부품에 대한 TestStages 간에 테스트된 매개변수(Id)를 비교하기 위해 상관 관계 플롯을 수행하고 싶습니다.
관련 제한 참조가 있는 x축의 Id1(모든 부품)에 대한 중앙값과 y축의 Id2(모든 부품)의 중앙값을 원합니다. 각 축의 라인(즉, x축에 필요한 TestStage 1의 LSL/USL 수직선과 y축에 필요한 TestStage 2의 LSL/USL 수평선).
JSL을 사용하여 데이터 테이블 구조를 수정하지 않고 이를 수행하는 방법은 무엇입니까?
아래와 같이 Id1 및 Id2에 대한 중앙값, 제한 등이 열 데이터(첨부된 행 데이터가 아님)로 있는 경우 이러한 유형의 상관 관계 플롯을 수행할 수 있습니다.
데이터 테이블 구조(다른 JSL 스크립트를 사용하여 가져옴)를 변경하거나 이를 기반으로 새 데이터 테이블(아래와 같이 split() 사용)을 생성하고 싶지 않으므로 제 질문입니다.
Names Default To Here (1);
Data Table( "egDataTable" ) << Split(
Split By( :TestStage ),
Split( :Median, :LSL, :USL ),
Remaining Columns( Drop All ),
Sort by Column Property
);
Graph Builder(
Size( 528, 457 ),
Show Control Panel( 0 ),
Variables(
X( :Median 1 ),
X( :LSL 1, Position( 1 ) ),
X( :USL 2, Position( 1 ) ),
Y( :Median 2 ),
Y( :LSL 2, Position( 1 ) ),
Y( :USL 2, Position( 1 ) )
),
Elements(
Points( X( 1 ), X( 2 ), X( 3 ), Y( 1 ), Y( 2 ), Y( 3 ), Legend( 65 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
65,
Properties(
0,
{Marker( "Star" )},
Item ID( "Median 2 / Median 1", 1 )
),
Properties(
1,
{Marker( "Minus" )},
Item ID( "LSL 2 / Median 1", 1 )
),
Properties(
2,
{Marker( "Minus" )},
Item ID( "USL 2 / Median 1", 1 )
),
Properties(
3,
{Marker( "Pipe" )},
Item ID( "Median 2 / LSL 1", 1 )
),
Properties( 4, {Marker( "Minus" )}, Item ID( "LSL 2 / LSL 1", 1 ) ),
Properties( 5, {Marker( "Minus" )}, Item ID( "USL 2 / LSL 1", 1 ) ),
Properties(
6,
{Marker( "Pipe" )},
Item ID( "Median 2 / USL 2", 1 )
),
Properties( 7, {Marker( "Minus" )}, Item ID( "LSL 2 / USL 2", 1 ) ),
Properties( 8, {Marker( "Minus" )}, Item ID( "USL 2 / USL 2", 1 ) )
)}
)
)
);
자동화 및 스크립팅Re: 데이터 테이블 구조를 수정하지 않고 상관관계 플롯안녕 @네오 ,
귀하의 문제를 완전히 이해하고 있는지 확신할 수 없지만 제가 생각하는 해결책을 찾기 위해 문제를 해석한 방법은 다음과 같습니다. 먼저, 테이블 구조를 변경하고 싶지 않은 것이 분명합니다. 이는 특히 자동화된 JSL 스크립트 등으로 실행되도록 설계하는 경우 이해할 수 있습니다.
아래 JSL 스크립트는 이를 수행하는 한 가지 방법입니다. 나는 다른 많은 것들이 있다고 확신하지만 적어도 올바른 방향으로 안내하여 이제 원하는 대로 색상, 스타일 등을 편집할 수 있습니다. 정확히 당신이 추구하는 것이 아닐 수도 있지만 가깝다고 생각합니다.
Names Default To Here( 1 );
dt = Data Table( "egDataTable" );
dt << New Column( "Median1", Continuous, Numeric );
dt << New Column( "Median2", Continuous, Numeric );
For( i = 1, i <= N Rows( dt ), i++,
If(
:TestParameter[i] == "Id1" & :TestStage[i] == 1,
:Median1[i] = :Median[i];
_LSL1_ = :LSL[i];
_USL1_ = :USL[i];,
:TestParameter[i] == "id2" & :TestStage[i] == 2,
:Median2[:PartNumber[i]] = :Median[i];
_LSL2_ = :LSL[i];
_USL2_ = :USL[i];,
.
)
);
Graph Builder(
Graph Spacing( 4 ),
Variables( X( :Median1 ), Y( :Median2 ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"Median1",
ScaleBox,
{Min( 0 ), Max( 1.1 ), Inc( 0.2 ), Minor Ticks( 1 ), Add Ref Line( _LSL1_, "Solid", "Blue", "LSL1", 1 ),
Add Ref Line( _USL1_, "Solid", "Blue", "USL1", 1 )}
),
Dispatch(
{},
"Median2",
ScaleBox,
{Min( -0.03 ), Max( 0.8 ), Inc( 0.1 ), Minor Ticks( 0 ), Add Ref Line( _LSL2_, "Solid", "Blue", "LSL2", 1 ),
Add Ref Line( _USL2_, "Solid", "Blue", "USL2", 1 )}
),
Dispatch( {}, "400", ScaleBox, {Legend Model( 3, Properties( 0, {Marker( "Star" )}, Item ID( "Median2", 1 ) ) )} )
)
);
도움이 되었기를 바랍니다!,
DS
*편집: 한 가지 언급하고 싶은 것은 다른 종류의 데이터 테이블 작업을 위해 이것을 일반화하려는 경우 레이블 간에 일관성을 유지하는 것을 고려할 수 있다는 것입니다. 예를 들어 TestParameter 열에 소문자와 대문자가 혼합되어 있습니다. 예: ID# 또는 id# 등이 아닌 Id1, id2, id3. 조건부 코딩을 수행할 때 일관된 구문이 있을 때 훨씬 더 쉬울 수 있으므로 대소문자 때문에 디버그해야 할 가능성이 줄어듭니다.
Re: 데이터 테이블 구조를 수정하지 않고 상관관계 플롯@SDF1 입력해 주셔서 감사합니다.
제가 첨부한 표는 내가 원하는 플롯의 모습을 보여줄 수 있도록 요리된 예시 표입니다. 실제 사례에서 각 테스트 단계에는 테스트된 약 50개의 테스트 매개 변수가 있으며 10개의 테스트 단계가 있습니다.
새 열을 생성할 필요가 없는 다른 접근 방식이 없는 한 다른 테스트 단계와 비교하기 위해 각 테스트 단계(올바르게 이해한 경우 스크립트)에서 테스트된 각 매개 변수에 대한 열을 생성하고 싶지 않습니다. 또한 수천 개의 부품이 테스트되었으므로 데이터 세트는 일반적으로 .
내 접근 방식을 변경하고 사용자가 두 개의 테스트 단계와 상관 관계를 지정해야 하는 매개 변수를 선택한 다음 거기에서 이동하게 할 것이라고 생각합니다.
보다 효율적인 접근 방식이 있다면 나는 모두 귀/눈입니다 
Re: 데이터 테이블 구조를 수정하지 않고 상관관계 플롯안녕 @네오 ,
나는 데이터 테이블이 모형일 뿐이라고 생각했습니다. 보유한 테스트 매개변수와 단계가 많기 때문에 새 열을 생성하고 싶지 않은 이유를 이해합니다. 새 열을 만들거나 데이터 테이블을 분할하지 않으려는 경우 원하는 데이터를 그래프로 표시하는 다른 방법이 있지만 데이터가 자체 전용 열이 아니기 때문에 수행할 수 있는 통계가 제한됩니다. 열처럼 JMP 내의 다른 플랫폼에서는 사용할 수 없습니다.
아래 코드는 원하는 것과 동일한 스타일의 그래프를 생성하지만, 그래프로 표시되는 데이터는 열로 데이터 테이블이 아닌 벡터로 메모리에 저장된 데이터이므로 "표시" 목적일 뿐입니다. 여전히 몇 가지 통계를 수행할 수 있습니다. 평균 및 1 std dev와 같은 일부 통계를 평균 주변의 타원형으로 포함했습니다. 그러나 앞서 언급한 것 때문에 몇 가지 사항에 제한을 받게 됩니다. 예를 들어 밀도 타원을 할 수는 없습니다(적어도 저는 방법을 모릅니다).
나는 당신이 가지고 있는 많은 테스트 단계, 매개변수 및 부분과 함께 작동하도록 스크립트를 일반화할 수 있어야 한다고 생각합니다. 기본적으로 모든 벡터를 메모리에 저장하기 위해 테이블을 반복하고 팝업 창을 가질 수 있습니다. Expr() ) 사용자가 보고 싶은 테스트 단계를 선택할 수 있습니다.
산출:

스크립트:
Names Default To Here( 1 );
dt = Data Table( "egDataTable" );
xrows = dt << RowSelection( Select Where( :TestStage == 1 ) ) << get selected rows();
xx = dt:Median[xrows];
xMean = Matrix( Mean( xx ) );
Xstdev = Std Dev( xx );
yrows = dt << RowSelection( Select Where( :TestStage == 2 ) ) << get selected rows();
yy = dt:Median[yrows];
yMean = Matrix( Mean( yy ) );
Ystdev = Std Dev( yy );
obj = New Window( "Example",
gbox = Graph Box(
Frame Size( 300, 300 ),
YName( "Median 2" ),
XName( "Median 1" ),
Y Scale( _LSL2_ - 0.1, _USL2_ + 0.1 ),
X Scale( _LSL1_ - 0.1, _USL1_ + 0.1 ),
Marker( Marker State( 11 ), Color State( 0 ), xx, yy ),
Marker( Marker State( 0 ), Color State( 4 ), xMean, yMean ),
Pen Color( "Green" ),
Oval( xMean - Xstdev, yMean + YStdev, xMean + Xstdev, yMean - Ystdev ),
Title( "Median 2 vs Median 1" )
)
);
yaxisbox = gbox[axisBox( 1 )];
xaxisbox = gbox[axisBox( 2 )];
yaxisbox << Add Ref Line( _LSL2_, "Line", blue, "LSL2" );
yaxisbox << Add Ref Line( _USL2_, "Line", blue, "USL2" );
xaxisbox << Add Ref Line( _LSL1_, "Line", blue, "LSL1" );
xaxisbox << Add Ref Line( _USL1_, "Line", blue, "USL1" );
이것이 당신이 가는 데 도움이 되기를 바랍니다!,
DS