不修改数据表结构的相关图我想做一个相关图来比较不同部分的 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