当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?我的数据表在第 1 列中有part_ID 条目。 在第 2 列中,显示 5 个汇总参数 - 最小值、Q1、中值 Q3、最大值以及测试限值 LSL、USL。 在第 1 列中,部件 ID 重复 7 次(对应于 5 个汇总参数 + LSL 和 USL,总共 7 次),之后出现下一个部件 ID(以及第 2 列中对应的 7 个数字)。
我不想改变数据表的格式(即不想转置)。
我想使用 5 个汇总参数和限制创建箱线图趋势图(X 轴上带有零件 ID)。 如何通过 JSL 执行此操作?
自动化和脚本编写视窗回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?是否有某些特定原因不将数据格式更改为更好的格式?
从

更容易管理的事情

如果您没有任何指示哪一行是哪一行,您确定它们始终处于相同的顺序吗?
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi谢谢。 我的原始数据采用底表的形式,但另外还有测量参数名称作为附加列。 在这种形式中,我知道如何使用 7 个参数绘制箱线图。
我使用 JMP Summary () 函数以顶部表格的形式获取数据。
我需要此表单以我想要的格式绘制其他图表,其中测量的参数数据(例如顶部表中的第 3 列)在一列中。 同一零件有多个具有不同范围的测量参数(出现在单独的列中),我将其绘制在 Y 轴上,并且仅在列中包含不同测量参数的数据允许我在其中获得不同的 Y 轴刻度JMP(X 轴上带有零件 ID)。 不同的测量参数是相关的,这样的图有助于理解相对趋势。
希望上面解释了为什么我的数据采用您的顶级表格的格式。
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?这篇文章可能会提供一些想法根据已汇总的值创建箱线图。
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi 。 谢谢。 我看过你链接中的食谱。 所描述的方法似乎仅在数据是第二个表的格式时才有效,这不是我想要的。
如果可以告诉 JMP 使用给定零件 ID(附件中的第 1 列)的相邻列(附加示例数据集中的标签)中给出的最小值、Q1、中值、Q3、最大值来创建箱线图,而不是 JMP 计算这些值本身来自每个部分的值的分布,我想我会得到我想要的。这可以通过 JSL 实现吗?
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?您可以尝试使用 Rect() 和 Line() 构建箱线图(还有箱线图 seg 可能有效,但您需要模拟数据或使用频率)。
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi谢谢,我想,箱形图段可以用来做我想做的事。
从脚本索引示例中,我不清楚如何为每个零件 ID(在 x 轴上)生成箱形图,如我的示例数据(之前附有)
我需要循环遍历零件 ID 吗? 那么这种情况下,如何确定画幅的大小、比例呢?
如果我可以使用我的示例数据获得基本示例,那将会很有用。

回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?箱形图 seg 可能只能用于为单个框架框创建单个箱形图,并且它将位于中心
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi谢谢。
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?如果您被迫使用现有的数据格式,您仍然可以向表中添加新列。 您可以为每个统计信息创建一列,以遵循前面链接中的选项一,或者添加两列(值 + 频率),然后遵循第二个选项。 或者使用图形脚本从不同部分构建完全定制的
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi 。 以顶部表格(以及所附的我的表格)格式提供数据的全部原因只是为了让我可以通过 Y 图在一组中具有不同的比例。
https://community.jmp.com/t5/Discussions/Can-you-change-y-axis-scale-independently-from-other-y-axis/td-p/17649
我不想给你“页面”选项,所以我去了并跟随@tx尼尔森建议将相关数据以他建议的形式放入单独的列中(假设我正确理解了他的建议)。
如果有任何其他方式不使用页面或@tx尼尔森的建议(另一个类似的这里), 洗耳恭听 :)。
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi感谢您对此主题的建议,我将返回该主题,因为我必须保持数据格式与之前附加在该线程中的示例数据相同。 我可以通过下面的脚本获得几乎我需要的东西(可能有更好的方法来做到这一点,但下面是我的故事)。 我需要帮助解决两件事。
- 我需要为每个partID(当前未在本地数据过滤器中选择,下左图)绘制一条连接Min和Max的垂直黑线。 当在本地数据过滤器中选择“最小值”/“最大值”时(下右图),它们通过垂直黑线(代替现在右图上的黑点)连接,我将了解箱线图的基本结构,其中我认为已经足够并且符合目的。 如何通过 JSL 获取每个零件 ID 的垂直线(V Line ()?)?
- 其次,实际数据中我测量的参数(示例数据中的电流、电阻)将>40。 因此,我不想按照我在脚本中所做的方式进行图例颜色设置。 如何将图例颜色默认设置为黑色(否则 JMP 为每个 Y 组设置不同的颜色,而不是我设置标记颜色的方式)。
Names Default To Here (1);
clear log ();
dt = Current Data Table ();<BR />
//Set LSL/USL marker and color
dt << Row Selection(
Select where( Contains( :Label, "LSL" ) | Contains( :Label, "USL" ) ),
Match case( 1 ),
Dialog( Edit( Contains( Source Column( :Label ) ) ) )
) << Markers( 29 ) << Colors( "Red" );
dt << Clear Select;<BR />
// Set Q1/Q3 marker and color
dt << Row Selection(
Select where( Contains( :Label, "Q1" ) | Contains( :Label, "Q3" ) ),
Match case( 1 ),
Dialog( Edit( Contains( Source Column( :Label ) ) ) )
) << Markers( 29 ) << Colors( "Black" );
dt << Clear Select;<BR />
//Set Median arker and color
dt << Row Selection(
Select where( Contains( :Label, "Median" ) ),Match case( 1 ),
Dialog( Edit( Contains( Source Column( :Label ) ) ) )
) << Markers( 0) << Colors( "Blue" );
dt << Clear Select;<BR />
// Plot chart
gb = Graph Builder(
Size( 404, 412),<BR /> Show Control Panel( 0 ),
Variables( X( :partID ), Y( :Resistance ), Y( :Current ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 37 ), Jitter( "None" ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 35 ), Jitter( "None" ) ) ),
Local Data Filter(
Add Filter(
columns( :Label ),
Where( :Label == {"LSL", "Median", "Q1", "Q3", "USL"} )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
37,
Properties( 0, {Line Color( 0 )}, Item ID( "Resistance", 1 ) )
), Legend Model(
35,
Properties( 0, {Line Color( 0 )}, Item ID( "Current", 1 ) )
)}
)
)
);

回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?添加到上面的这个附加脚本给出了使用 V Line () 所需的内容。
仅适用于 PartID =1 的示例(见下图)。 如何使其自动循环?
gbr = gb << report;
// For FrameBox (1)
Q1_Part1_Para1 = 2.75;
Q3_Part1_Para1 = 3.1;
// For FrameBox (2)
Q1_Part2_Para1 = 250;
Q3_Part2_Para1 = 302;
PartNo = 1;
Eval(EvalExpr(gbr [Framebox (1)]<< Add graphics Script (
Pen color (black); V Line (PartNo-1, Q1_Part1_Para1, Q3_Part1_Para1);
)));
Eval(EvalExpr(gbr [Framebox (2)]<< Add graphics Script (
Pen color (black); V Line (PartNo-1, Q1_Part2_Para1, Q3_Part2_Para1);
)));
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?您可以使用 Summarize() 来获取唯一的partID 值。 然后,您可以使用数据表下标与 Loc() 组合来在循环时获取特定 partID 的行。 然后计算/获取您的值并添加您的行
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi
>>您可以使用 Summarize() 来获取唯一的partID 值。
好的
>>然后您可以使用数据表下标与 Loc() 组合来在循环时获取特定partID 的行。
没用过Loc()。 这是否为我提供了每个partID 的X 坐标。 带有我的示例数据的示例将非常有用。
>>然后计算/获取您的值并添加您的行。
您的意思是,计算每个部分的 X 坐标,因为其他数字 Min、Max、Q1、Q3 和 Median 已经计算出来。
另外,我是否需要循环遍历每个 FrameBox 还是有更直接的替代方案?
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?您的partID在图表中的顺序与表(和汇总)中的顺序相同,因此您已经有了x坐标。 如果您已经计算出所需的所有值,则只需从数据表中检索它们即可。 下面是使用 Summarize、Loc 和数据表下标的示例
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Summarize(dt, uniq_vals = by(:age)); // Summarize returns characters
For Each({uniq_val}, uniq_vals,
val_rows = Loc(dt[0, "age"], Num(uniq_val));
show(val_rows);
f_rows = val_rows[Loc(dt[val_rows, "sex"], "F")];
show(f_rows);
f_heights = dt[f_rows, "height"];
show(f_heights);
);
您只有两个框架框,但您希望在其中添加多行,因此不需要循环框架框(循环partIds)
编辑:
另外,您可以使用 << Get RowsWhere 代替 Loc,因为它通常更容易使用
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi 。 好的。 谢谢。 我会尝试一下(如果我遇到困难会回来)。
在我的实际数据集中,测量参数的数量> 50(可能更多),因此如果我将所有 50 个参数趋势图绘制在彼此之上,将有 50 个 FrameBox,因此我的问题是循环 FrameBox。
另外,对于我的 PartID = 1,我建议使用 X= 0,作为上面脚本中 V Line () 中的 X 坐标。 这是应该的样子吗(即 V 线的 x 坐标从 0 开始,而不是从 1 开始,即使它显示为 1)?
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?如果有那么多参数,那么有额外的循环是个好主意。
对于 X = 0 的事情,我建议尝试一下。 看看会发生什么(这样你通常会学到最多)。 从X轴设置也可以看到,值为0,标签为1

回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?@jthi好的。 谢谢。 还有一件事困扰着我。 我已关闭脚本中的抖动,但顶部 (Q3) 和底部 (Q1) 标记仍然显示有偏移。 您可以使用之前附加的数据表运行我的脚本来测试这一点(我使用的是 JMP 16.2)。
是否还有其他抖动设置需要关闭。
如果我使用以下内容为 Q1 和 Q3 设置标记(只是在绘制垂直线之前尝试获取框形状),则抖动/偏移会更加明显,但即使使用水平标记,我也会看到一些偏移。 我错过了什么吗?
// Q1/Q3 marker and color
dt << Row Selection(Select where(Contains( :Label, "Q3" ) ),Match case( 1 ),Dialog( Edit( Contains( Source Column( :Label ) ) ) )
) << Markers( "Π" ) << Colors( "Black" );
dt << Clear Select;
dt << Row Selection(Select where( Contains( :Label, "Q1" ) ), Match case( 1 ), Dialog( Edit( Contains( Source Column( :Label ) ) ) )
) << Markers( "Џ" ) << Colors( "Black" );
dt << Clear Select;
更正:偏移似乎是由于 JMP 渲染图表造成的。 水平拉伸图表可以修复偏移量。
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?以此方式检查
frame = (gbr)[FrameBox( 1 )];
seg = (frame << FindSeg( Marker Seg( 1 ) ));
{method, axis, limit, spacing, seed} = seg << Get Jitter();即使将抖动设置为无,我也确实获得了“种子”值
{"None", "XY", 1, 0, 184430754}我的观点是否不稳定(看起来确实如此)?
回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?您的抖动设置为“无”

我想这意味着不应该添加随机噪声

回复:当 5 个汇总参数(最小值、Q1、中值 Q3、最大值)和限值(LSL、USL)位于与给定的 part_ID 对应的列中时,如何创建箱线图?由早期脚本(在此线程中)调用的这个附加脚本可以满足我的需求。 脚本特定于我的数据,但显示了一种在不同框架盒的循环内绘制 V Line () 的方法。
在 Graphbuilder 上更改为 BoxPlots,并在本地数据过滤器中选择 Q1、Q2 和中值,即可获得正确的箱线图。 V 线 () 连接最大值和最小值,完成箱线图的解剖。由于仅选择了 Q1、Q2,而忽略了其余数据,我认为得到了正确的框(在本地数据过滤器中选择更多参数,例如 Min 和 Max 会给出错误的框)。
Names Default To Here (1);
Clear Log ();
setVLines_atMinMax = Function ( {gbr, FrameboxNo, PartNo, Min, Max}, {},
Eval(EvalExpr(gbr [Framebox (FrameboxNo)]<< Add graphics Script (
V Line (Expr(PartNo-1), Expr(Min), Expr(Max));
)));
);
gbr = gb << report;
nParts =5;
nc = ncols (dt); //number of coulms in my data table
For (j =1, j <=(nc-1), j++,
FrameboxNo = j;
for ( i = 1, i <= nParts, i++,
ind = (7*i-3); //show (ind);
ind_next = (7*i -3) + 1; //show (ind_next);
PartNo = Num(:PartID[ind]); //show (PartNo);
Min = Column(nc) [ind]; show (Min);
Max = Column(nc) [ind_next]; show (Max);
setVLines_atMinMax (gbr, FrameboxNo, PartNo, Min, Max);
);
nc = nc-1;
);
//show (FrameboxNo); show (nc);
