不修改數據表結構的相關圖我想做一個相關圖來比較不同部分的 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 ) )
)}
)
)
);
自動化和腳本回复:不修改數據表結構的相關圖你好@尼奧,
我不確定我是否完全理解您的問題,但這是我如何解釋它以提出我認為是解決方案的方法。 首先,很明顯您不想更改表結構,這是可以理解的,尤其是當您將其設計為作為自動 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 列混合了小寫和大寫,例如 Id1、id2、id3,而不是全部是 ID# 或 id# 等。 在進行條件編碼時,如果您具有一致的語法,有時會容易得多,因此由於字母大小寫而不得不調試的可能性較小。
回复:不修改數據表結構的相關圖@SDF1感謝您的投入。
我附上的表格是一個精心製作的示例表格,這樣我就可以展示我想要的情節。 在實際案例中,每個測試階段大約測試了50個測試參數,共有10個測試階段。
我不想在每個測試階段(如果我理解正確的話,你的腳本)為每個測試參數生成一個列來與另一個測試階段進行比較,除非有另一種方法不需要生成新列。 此外,測試了數千個零件,因此開始時數據集通常非常大。
我想我會改變我的方法,讓用戶選擇需要關聯的兩個測試階段和參數,然後從那裡開始。
如果有更有效的方法,我會洗耳恭聽:)
回复:不修改數據表結構的相關圖你好@尼奧,
我認為數據表只是一個模型。 有了盡可能多的測試參數和階段,我理解您為什麼不想生成新列。 如果您不想創建新列或拆分數據表,還有另一種方法來繪製您想要的數據,但您可以對其進行的統計有限,因為數據不是它自己的專用列。 您不能像在列中那樣在 JMP 的其他平台中使用它。
下面的代碼將生成一個與您想要的樣式相同的圖形,但它只是為了“顯示”目的,因為正在繪製圖形的數據是作為向量保存在內存中的數據,而不是作為列保存到數據表中的數據。 您仍然可以做一些統計——我已經包含了一些統計數據,例如均值和 1 個標準差作為均值周圍的橢圓。 但是,由於我之前提到的,你會在某些事情上受到限制。 例如,您不能對此做密度橢圓(至少我不知道該怎麼做)。
我認為你應該能夠將腳本概括為與你擁有的許多測試階段、參數和部件一起工作,你基本上只是循環遍歷表以將所有向量保存在內存中,然後可能有一個彈出窗口(通過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