データテーブル構造を変更しない相関プロット添付のデータ表の例に示すように、相関プロットを作成して、さまざまな部品の TestStages 間でテストされたパラメーター (Id) を比較したいと考えています。
X 軸に Id1 (すべてのパーツ) の中央値、Y 軸に関連する制限参照を持つ Id2 (すべてのパーツ) の中央値が必要です。それぞれの軸上の線 (つまり、TestStage 1 の LSL/USL 垂直線は x 軸に必要であり、TestStage 2 の LSL/USL 水平線は y 軸に必要です)。
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 スクリプトは、その方法の 1 つです。 他にもたくさんあると思いますが、少なくとも正しい方向へ導き、色やスタイルなどを必要に応じて編集できるようになります。 それはあなたが求めているものとまったく同じではないかもしれませんが、それに近いものであるはずだと思います。
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
*編集: 私が言いたかったことの 1 つは、他の種類のデータ テーブルを操作するためにこれを一般化したい場合は、ラベル間の一貫性を考慮する必要があるかもしれないということです。たとえば、TestParameter 列には小文字と大文字が混在しています。たとえば、すべてが ID# または id# である代わりに、Id1、id2、id3 などです。 条件付きコーディングを行う場合、構文に一貫性があると、大文字と小文字が原因でデバッグが必要になる可能性が少なくなり、非常に簡単になる場合があります。
Re: データテーブル構造を変更せずに相関プロットを作成する@SDF1ご意見ありがとうございます。
私が添付した表は、プロットをどのように見せたいかを示すために調理されたサンプル表です。 実際の場合、各テスト ステージでは約 50 個のテスト パラメータがテストされ、テスト ステージは 10 個あります。
新しい列を生成する必要のない別のアプローチがない限り、各テストステージ(私の理解が正しければスクリプト)でテストされた各パラメーターの列を生成して、別のテストステージと比較することはしたくありません。 また、何千もの部品がテストされるため、データセットは通常、開始時点で非常に大きくなります。
アプローチを変更して、どの 2 つのテスト段階とどのパラメータを関連付ける必要があるかをユーザーに選択してもらい、そこから作業を進めようと思います。
より効率的なアプローチがあれば、私はすべての耳/目です:)
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