JSL - 生成循环遍历具有不同变量的列的 -xy 图
问候,
背景:我有一个非常大的数据集,是半导体器件特定射频测试的输出。 在此射频测试期间,有多种不同的重要条件。 我有 3 个输出,在 16 个不同的通道上以 6 种不同的测试状态进行测试,这需要我生成 105 个不同的图表。
示例:测试状态 1 下通道 1 上的增益与频率;测试状态 1 下通道 2 上的增益与频率,其中我有 15 个通道和 6 个测试状态。
我在这些讨论板上搜索了解决方案,我来的壁橱是 2017 年开始的一个主题,标题为“如何通过JSL将JMP图导出到PPT?
我尝试合并此解决方案中使用的脚本来帮助我,我可以让它制作所需数量的绘图,但无法过滤掉特定的通道。
我想我很难传达这一点,所以如果您需要澄清,请询问。
谢谢
Summarize( dt, lstChannel = By( :channel ) );
gb = Graph Builder(
invisible,
Size( 1225, 952 ),
Show Control Panel( 0 ),
Variables(
X( :Name( "Freq _(GHz)" ) ),
Y( :Gain ),
Group X( :wafer_num ),
Overlay( :RowCol ) ),
Elements( Smoother( X, Y, Legend( 19 ) ) )
);
For( i = 1, i <= N Items( GroupBy ), i++,
gb << Local Data Filter(
columns(
:wafer_num,
:channel,
:RowCol),
Where( :channel == LstChannel[i] ) ),
// I would like to loop through the teststates as well
Where( :teststate == 1 ),
Mode( Show( 1 ), Include( 1 ) ) );
If( i == 1,
gb << Save Presentation( "$TEMP/jmp_example2.pptx" ),
gb << Save Presentation( "$TEMP/jmp_example2.pptx", Append )
);
gb << remove data filter;
);
Open( "$TEMP/jmp_example2.pptx" );回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图我猜另外两个没有连接
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图感谢您提供的信息,它总是很有洞察力。 我确实认为你碰巧是对我帮助最大的人,这是非常偶然的。 看,我是一家铸造厂的工业工程师,该工厂拥有非常高的混合小批量产品组合,并且我们进行了大量的射频测试。 你提到的一切:
- 有一个已知的范围,例如控制或规格限制,
- 需要缩放到 +/- k sigma 之类的值,
- 需要控制网格线,例如每0.5 sigma一条网格线,
- 标称值很大但变化很小的数据,例如,均值是 1750222,stdev 是 0.000023,然后我绘制一个变换 Y 均值并找出一个好的比例并使用算法,gdinc.jsl
- 执行分析并确定数据是否高度倾斜或块状(聚集)。
这就是我想要实现的目标,我们正在测试,我们的客户正在使用一些基于无数据的广泛规格限制,因此我们试图根据 +/- 3 sigma 和 +/- 4.5 sigma 以及随附的上限和下限控制来确定规格限制限制。另一个例子是,当我询问是否加宽分布图的 X 轴时,这是因为我们当前的规格限制是 LSL = 20 和 USL = 40。 这就是为什么我是 JMP 的热心拥护者,因为质量和流程实用程序中拥有出色的工具。
我对绘制多元数据分析知之甚少,但我会尝试一下。
事实上,这次谈话让我明白了为什么我又来到这里。 我希望您能提供有关使用您为我提供的用于“Fix Y by X”分析的图形生成器和分布的相同绘图方法的意见。 我觉得这是一个非常好的分析工具,因为我们可以看到数据集之间的差异(统计上),在我们的例子中是wafer_number。 当然,我使用每对学生的 T 检验来比较平均值...... 我尝试即插即用,但对 dispacth 函数感到困惑。附件是数据表和我正在尝试执行的操作的“保存到脚本”窗口以及输出图片。 再次强调,您的所有帮助都非常有帮助。
旁注,我问我的经理我是否可以参加深入的剧本写作课程,他说可以,所以如果您有任何建议,请告诉我。 我在马里兰州巴利特莫尔地区。
英格
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图英,
您没有具体说明您要寻找什么。 我通常使用 JMP 默认缩放比例,如果我希望所有子组都使用相同的轴缩放比例,则可以使用类似以下内容的缩放比例。 该脚本将感兴趣的变量命名为 ylist,但这可以应用于任何数字连续变量(列),甚至日期时间。技巧是让 JMP 对所有内容进行缩放,然后将轴设置复制到表列,然后使用该列的任何图形都将部署该比例。
Names Default to Here(1);
ylist = {"Sepal length", "Sepal width", "Petal length", "Petal width"};
dt = Open("$sample_data/iris.jmp");
//get common axis
for(i=1, i<=nitems(ylist), i++,
ovl = dt << Overlay Plot(Invisible,
Y( Column(dt,ylist[i]) ), //yaxis
Overlay( 0 )
);
report(ovl)[AxisBox(1)] << Save to Column Property;
ovl << close window;
);
//now the same axis will be applied to all sub groups
ovl1 = dt << OverlayPlot( Y( :Petal length ), Overlay(0), By(:Species) );
//all 3 subgroups have the same Y - axis
//ovl = dt << OverlayPlot( Y( eval(ylist) ), Overlay(0), By(:Species) );
仅当满足以下条件时,我才会对轴进行自定义缩放:
- 有一个已知的范围,例如控制或规格限制,
- 需要缩放到 +/- k sigma 之类的值,
- 需要控制网格线,例如每0.5 sigma一条网格线,
- 标称值很大但变化很小的数据,例如,均值是 1750222,stdev 是 0.000023,然后我绘制一个变换 Y 均值并找出一个好的比例并使用算法,gdinc.jsl
- 执行分析并确定数据是否高度倾斜或块状(聚集)。
关于异常值检测,我还没有找到一种适用于所有数据的方法。 对于具有强右偏数据的单变量数据(例如零膨胀泊松),我喜欢使用修改后的 Lenth 方法:
- uscreen = 中位数 + k * (上 p 百分位数 -中位数) / Abs( 正态分位数(p) )
- lscreen = 中位数 - k * (中位数 - 下(p)百分位数/ Abs(正态分位数(p) )
- 其中 p 可以是 0.1(对于 10 和 90 个百分位数)或 p 可以是 0.25,那么这将是修改后的伪 sigma,并且对于汇总数据,通常 k 位于 [4,6] 中。 有时对于原始数据,我使用更大的 k。
- 另外,我通常会筛选一个变量的所有数据,但如果按组差异很大,如果每组都有足够的数据,我会按组筛选。
下面是按组计算筛选值的示例。 如果 vargroup 有 10 个组,则 uscreen 和 lscreen 是大小为 10 的向量,vg 是 10 个 vargroup 名称的列表。
//Find global outliers by vargroup for raw measurement data
//Use an assymetric 6 pseudo-sigma, computed from the 10 & 90th percentiles.
summarize( vg=by(vargroup),
c=count,
q10=quantile(varvalue,.10),
q50=quantile(varvalue,.50),
q90=quantile(varvalue,.90)
);
uscr = q50 + 6*(q90-q50)/Normal quantile(0.9);
lscr = q50 - 6*(q50-q10)/Normal quantile(0.9);请注意:
- 没有一种正确的方法,您应该始终与审查数据的方法一起审查这些方法。 异常值永远不应该被忽视,因为它们可能会带来重要的信息。
- 我经常使用 2 级筛选,特别是当我需要计算控制限、筛选绘制点和筛选限制时……控制限不应容纳 5 和 6 西格玛数据。
- 如果您要创建每周分析,请注意您每周可以获得不同的筛选值。 您可能希望每周使用相同的限制进行一次大型分析。
- 对于多变量数据,您应该使用多变量屏幕。 参见图形。 根据单变量限制,两个明显的异常值受到控制。 因此,如果数据强相关,则应使用相关筛选。 JMP 多元有一个很好的多元屏幕。

回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图早上好摩根0 ,
之前您提到“有多种方法可以自动缩放,并自动查找和消除异常值”
我想知道你是否介意与我分享?我已经做了很多编码,并且通过一些小的调整我已经接近结束了。
英格
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图首先,我的名字是大卫。 很高兴见到你..
这是正确的,我确实想要一个统一的比例,并会根据最坏的情况调整 -x 轴。我很想听听您关于删除异常值的建议。 这些正在杀死我的数据集.. 我们正在电气测试的部件要么通过,要么勉强通过,要么灾难性地失败。 那些发生灾难性故障的部件需要拆除。
我将把您修改后的脚本插入我的主脚本中进行测试。 再次,我非常感激。 我还要感谢您的 Include().. 我的脚本的很大一部分只不过是 SQL 数据拉动字符串。 我们的数据库有 8 个不同的表,我必须根据测试类型从中提取数据。
再次感谢你...
这是一个示例供参考:我有 9 个这样的代码,它们占用了大量代码行,这些代码通过一个 Include() 解决了
testdata_HAY_DC_QQ_Data = Expr(
"
SELECT
t1.testdate,
t1.wafer_id,
t1.wafer_number,
t1.lot_number,
t2.rownum,
t2.colnum,
t2.die_id,
t2.part_name,
t2.testname,
t2.channel,
t7.header_id,
t7.idx,
t7.run_id,
t7.set_id,
t7.Supply_Name,
t7.Voltage,
t7.Current
FROM tst_master t1
LEFT OUTER JOIN tst_dataset_header t2
ON ( t2.run_id = t1.run_id )
LEFT OUTER JOIN tst_dc_data t7
ON ( t7.header_id = t2.header_id )
WHERE (t1.wafer_number LIKE '"||SelectedLot||"')
AND (t2.testname LIKE '"||SelectedTest||"')
"
);
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图
因根斯特恩,
我的印象是您希望所有发行版都具有相同的规模。JMP Distribution 通常能够出色地将直方图缩放到手头的数据。 但是,当您绘制数据子集时,各个直方图的比例将会不同。 如果您知道数据的范围,则为 Lo、Hi 和 inc 分配值。如果您希望脚本处理其范围可能随流程更改而更改的数据或?那么计算 Lo 和 Hi 以及 inc 应该是脚本的任务。
对于之前的脚本,我只使用了最小值和最大值不排除的数据。
Lo = Floor( Col 最小值 ( :test_2 * If( Excluded(), Empty(), 1 ) ) );
Hi = Ceiling( Col Maximum( :test_2 * If( Excluded(), Empty(), 1 ) ) );
下面,我做了另一个修改,在两端留出一些空间:计算未排除数据的标准偏差并添加一半标准偏差。我提出比较分布的替代图表的原因之一是 JMP 将缩放到所有包含的数据,并且您可以看到通道和测试状态的影响。
dt = Current Data Table();
jjrn3 = New Window( "Distribution [test_2]", <<JOURNAL></JOURNAL>
有多种方法可以自动缩放、自动查找和消除异常值。 我不愿意强烈推荐,因为一个行业接受的方法可能另一个行业不接受;普通数据方法通常不适用于块状数据(聚类数据或空间数据)或零膨胀缺陷数据或可靠性数据。我的目的是指出可能适合你也可能不适合你的替代方案。
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图
是的,你的技能非常出色,我随时都会上你的 JSL 课程。
不过问题很快.. 我用 gd_inc.jsl 运行它,这就是我得到的.. 我可以看到规模几乎是完美的,但我的 15 个数据集有这 2 个差异。 并不是说将来不会发生这种情况.. 当你说用你引用的第二个脚本修改你的脚本时,我很困惑。 我试图尊重并找出 10.5 和 42.0 的来源,并认为它与 log() 函数有关,但不确定。

回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图gd_inc() 是之前在此博客路径上发送的用户函数。我又附上了。在使用脚本之前将代码添加到脚本中,或者将脚本(我称之为 gd_inc.jsl )保存到有用函数的公共目录、您自己的个人库以及当您想要计算良好的轴增量时的任何脚本,添加声明。
Include( "mydirectory/gd_inc.jsl" );
对于支持公司报告的人来说,他们经常创建一个大脚本,命名为 usr_functions.jsl 之类的东西。然后,他们不再使用大量 Include() 语句,而是仅使用一个 Include("mydirectory/usr_functions.jsl")
这里又是这个函数。 看看之前的帖子,有例子说明如何使用这个功能。
gd_inc = Function({xlo, xhi, ntic}, {sp,tt, yrnd, ginc, ndec,lc, ll},
sp = (xhi - xlo)/ntic;
tt = log10(sp);
yrnd = If(
tt > 0, 1 - Floor( tt ),
Abs( Floor( tt ) - 1 )
);
ginc =round(sp,yrnd);
ndec = length(word(2,char(ginc),"."));
lc = length(word(1,char(xhi),"."));
if(ndec>0, lc=lc+ndec+1);
if(xlo <0, lc++); //add 1 character for the negative sign
ll=[1,1,1];
ll[1] = ginc; //increment
ll[2] = ndec; //# decimals
ll[3] = lc; //character length
ll
); // end gd_inc
/* test cases
show(gd_inc(1,11,10), gd_inc(.001, .005, 10), gd_inc(10000,20200, 10) )
*/顺便说一句,我多年来一直在使用和教授 JMP 和 JSL。 所以我的知识并没有那么惊人,只是想分享。
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图你对 JSL 的东西太棒了.. 我什至不知道是否能找到其中任何一个。 我现在正在测试发行版.. 我对其他图表也感激不尽。 我确信我也会被问到如何做到这些。 仅供参考,我正在使用 JMP 12.1.0,但是我们公司正在转向 JMP 14,我迫不及待地因为我在这个网站上找到了半导体工具包插件。
当涉及 gd_inc 语句时,我收到错误。
名称未解析: gd_inc 正在访问或评估 'gd_inc' , gd_inc( Lo, Hi, 10 ) /*###*/
在以下脚本中,错误标记为 /*###*/
dt = Current Data Table();
jjrn3 = New Window( "Distribution [test_2]", <<JOURNAL></JOURNAL>
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图因根斯特恩,
我附上了2个脚本:
- ModifiedDistribution[test_2].jsl,以及
- 其他分布图.jsl
要点是,并非每个平台报告都具有相同的结构或相同的消息,可用的内容取决于您的 JMP 版本。显示树结构和获取 XML 是可以帮助您发现报告结构的消息,脚本索引列出了显示框的消息。我喜欢使用 XPath() 来“处理”难以找到的对象或多个段,例如 BoxPlotSeg 和 HistSeg。但是,还有其他方法来引用对象。 要获取直方图的 Y 变量比例框的句柄,请使用
_xx = gb<< Xpath("//ScaleBox[@charID='1']");
_xx << 消息;
或者
报告( gb )[ScaleBox(1)] << 消息;
另一个脚本显示了适合比较分布的替代图。
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图谢谢你的剧本... 我对你提出的第一个问题有疑问。 您只是将其放入主脚本中还是单独的新脚本中?
我喜欢你绘制并提供给我老板的图表,所以我正在等待他关于在他要求的许多报告中实施该图表的消息。
我还采用了您给我的脚本,说明如何通过 -y 绘制 -x 并用 Distribution 替换 Graph Builder,它几乎完美地工作。 我确实有一个关于树结构的问题。 我能够反转到这一行并找到文本框(1),但是通过分发修改,我在运行此脚本时收到错误。 我似乎无法找到需要删除的部分。 我附上数据表和修改后的脚本,其中包括分布函数。
(国标<<顶部报告)[文本框( 1 )] <<删除; //删除where语句
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图谢谢您的建议/代码.. 这周我要尝试一下.. 我有一个软期限来演示数据拉取、表格格式和图形输出。 你的帮助大大增加了我成功的可能性
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图正如我在之前的回复中提到的,“您可以创建固定比例或使用最喜欢的算法来找到适合手头数据的最佳比例。 ” 下面是为脚本 7_InteractiveDisplays_Alternates.jsl(针对《JSL Companion》第二版)创建的函数 gd_inc()。
这是我在编写值范围未知的应用程序时使用的函数的简化。该脚本假设固定十进制格式可以工作。 更通用的脚本将确定是否有太多小数,然后切换到科学记数法或更改为对数刻度等。在使用它之前,您应该尝试一下。
参数是低、高和增量数。 它返回一个由 inc 值、格式和最大长度的小数组成的向量;在完整的脚本中,它用于 x 轴,并且方向根据其长度而改变。 或者,如果应使用固定十进制格式以外的其他格式,则可以使用长度来触发。
gd_inc = Function({xlo, xhi, ntic}, {sp,tt, yrnd, ginc, ndec,lc, ll},
sp = (xhi - xlo)/ntic;
tt = log10(sp);
yrnd = If(
tt > 0, 1 - Floor( tt ),
Abs( Floor( tt ) - 1 )
);
ginc =round(sp,yrnd);
ndec = length(word(2,char(ginc),"."));
lc = length(word(1,char(xhi),"."));
if(ndec>0, lc=lc+ndec+1);
if(xlo <0, lc++); //add 1 character for the negative sign
ll=[1,1,1];
ll[1] = ginc; //increment
ll[2] = ndec; //# decimals
ll[3] = lc; //character length
ll
); // end gd_inc
/* test cases
show(gd_inc(1,11,10), gd_inc(.001, .005, 10), gd_inc(10000,20200, 10) )
*/获得结果后,修改脚本
_yscl = gd_inc(Lo,Hi, 10);
_xx[1] << Axis Setings( {Min( Lo ), Max( Hi ), Inc( _yscl[1] ),
Minor Ticks( 1 ),
Label Row( {Show Major Grid( 1 ), Show Minor Grid( 1 )} ),
Format("Fixed Dec",12,_yscl[2])
});
JMP 在自动缩放方面做得很好,缩放比例对于图形生成器来说太宽的原因是它进行缩放以便能够显示点而不仅仅是平滑的曲线。 一种选择是获取样条曲线值并绘制它们。
如果您选择不是为此,您需要找到曲线的最大值和最小值,并且需要决定是否希望 Y_i 的所有图形都具有相同的比例,或者每个 Y_i 和测试是否需要具有相同的比例或每个图形都有自己的比例。JMP Spline Smooth() 函数返回样条值,您可以找到每个可能曲线的最大值和最小值,然后获得所有曲线的最大值和最小值。 这将提供 Lo 和 Hi,我通常使用 10 作为增量数。
然后使用gd_inc()函数并修改。如果您知道低值和高值,则为每个 Y 创建一个表或常量。
自定义缩放可能会因多条曲线和样条线等自定义曲线而变得混乱。如果我有时间,我会附上您的虚拟数据的更新脚本。
顺便说一句,我不确定你的虚拟数据有多真实。 在 PowerPoint 中比较多个图表可能会令人困惑。GraphBuilder 非常适合比较图表。 与其使用大量图表,不如进行一些比较(不一定是下面的)可能有用。 下面是用于测试的 Y_3 与通道以及不同的 X 值。

回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图没有加载表..
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图我刚刚尝试了你的解决方案。 我通常将脚本保存到窗口,这样我就可以看到图形的外观。
我附上了修改后的虚拟数据,让您了解我到底想要实现什么目标。
对于 15 个通道,在这种情况下有 2 个具有不同输出的测试状态,我看不到一种适合所有解决方案。
请告诉我你的想法。
该特定测试有 3 个输出。我必须单独评估。
大卫
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图非常感谢.. 今天晚上我要尝试一下..
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图您可以创建固定比例或使用最喜欢的算法来找到适合手头数据的最佳比例。
下面附有先前提供的脚本的修改版本。 下面列出了新代码。请注意,对于虚拟数据,最佳缩放比例可能是 -8 到 8,但是,我选择 -7 来演示多个图形可能会被裁剪。
_xx = gb<< Xpath("//ScaleBox[@charID='Y']");
_xx[1] << Axis Setings({Min( -7 ), Max( 8 ), Inc( 1 ), Minor Ticks( 1 ),
Label Row( {Show Major Grid( 1 ), Show Minor Grid( 1 )} )});有多种方法可以确定如何编写更改脚本。 最简单的方法是编写一个图表的脚本,然后使用 GUI 来
更改轴或标题或图例。 然后从红色倒三角形(在图形生成器轮廓上)选择保存脚本>到脚本窗口。 使用此方法它将显示一个 Dispatch 参数。见下文。
Graph Builder(
Size( 1242, 709 ),
Show Control Panel( 0 ),
Variables( X( :X ), Y( :Y ), Group X( :Wafer ID ), Overlay( :RowCol ) ),
Elements( Smoother( X, Y, Legend( 19 ) ) ),
Where( dt:Channel == chnl & dt:Test State == tst ),
SendToReport(
Dispatch(
{},
"Graph Builder",
OutlineBox,
{Set Title( "Results for Channel=1 and Test State=1" )}
),
Dispatch(
{},
"Y",
ScaleBox,
{Min( -7 ), Max( 8 ), Inc( 1 ), Minor Ticks( 1 ),
Label Row( {Show Major Grid( 1 ), Show Minor Grid( 1 )} )}
)
)
);由于您的标题是自定义的,因此将 Dispatch 删除到 OutlineBox,然后在 for 循环中使用此代码,每个图表将具有脚本中指定的相同缩放比例。
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图我可以再问您一个与 For() 循环和图表相关的问题吗?
有没有办法自动缩放最佳拟合?
如果我可以从 Min = 5 和 Max = 30 获得示例中的比例,我们就可以更好地了解部件在频率范围内的具体表现......
当然,我必须事先删除异常值。
谢谢
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图我非常感谢你在这方面的帮助。 这里的工作人员甚至没有人可以远程告诉我如何做你所做的事情。
有了这个,我完成这项工作的时间至少减少了 80%。
您的解决方案和我正在编写的用于访问数据库文件的 SQL 脚本将使我们与客户处于有利的位置。
再次感谢你..
D
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图感谢您的答复。 我将用你的例子来看看我是否能弄清楚..
我尝试使用“选择位置”语句,效果很好。我只是想减少我必须编写的代码量。 我对上面列出的所有参数进行了 5 种不同的测试。
当我尝试这个时我会报告。
再次感谢..
回复:JSL - 生成循环遍历具有不同变量的列的 -xy 图你好,
我建议修改生成图表的方法以使用 where 语句而不是数据过滤器。数据过滤器非常适合交互式可视分析,但是,由于您的视图是不可见的,我建议您使用 where 语句。当使用where语句时,where文本框可见;它可以被删除。 您还可以使用 By 参数 By(:Channel, :Test State)。 然后脚本需要访问每个 GB 并保存演示文稿。
我不喜欢“保存演示文稿”,我喜欢使用 P3ICLI,这是一个免费的外部命令行程序,可以从 JMP 输出创建 PPTX 幻灯片。 看使用 P3ICLI 创建 PPTX 的 JSL 示例。 与任何代码一样,它看起来很混乱,但可以创建非常自定义的内容,并且可以控制图形和标题的大小。
然而,对于使用“保存演示文稿”保存多个绘图,我们编写了一些技巧来将多个布局显示记录为图片,使用“保存演示文稿”,但您必须调整大小。
无论如何,附加的是一个虚拟数据表来模拟您的场景和两个脚本,每个脚本每页保存一张图片
希望这可以帮助。