我有一个代码“sample.jsl”,它有一个循环来为每列创建一个双变量图。 我正在尝试向此循环添加一个范围滑块框,以便在我运行脚本后,它会为所有列创建一个图形,每个图形都有单独的范围滑块框。
所有 x 轴列的限制都在“limits.jmp”中,数据文件是“Data.jmp”。 代码“sample.jsl”一次为所有参数创建一个图表。 我想修改代码,以便它还为所有图表添加一个范围滑块框。
范围滑块框应具有控制上限 (ucl) 和 lcl 作为两个动态滑块。
我有这个创建范围滑块框的代码,但它只适用于单个图表。 我需要一个脚本来创建所有图形以及动态范围滑块框。
任何帮助,将不胜感激。 提前致谢
myFinalDisplay = expr(
myLimitCol = column(dt, "ColA"); //new
myLimitMin = colMinimum(myLimitCol); show(myLimitMin); //new
myLimitMax = colMaximum(myLimitCol); show(myLimitMax); //new
mylcl = globalLCL["ColA];
myucl = globalUCL["ColA];
myGbDispObj = dt << Bivariate(
Size( 550, 400 ),
Y( "res" ),
X( "ColA" ),
Automatic Recalc( 1 ),
Histogram Borders( 1 ),
Summary Statistics( 1 ),
Fit Spline( 2, {Line Color( {212, 73, 88} )} ),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Row Legend(
"Grouping",
Color( 1 ),
Color Theme( "JMP Default" ),
Marker( 1 ),
Marker Theme( "Solid" ),
Continuous Scale( 1 ),
Reverse Scale( 0 ),
Excluded Rows( 0 )
)}
),
Dispatch(
{},
"1",
ScaleBox,
{Add Ref Line({mylcl, myucl}, "Solid", "Light YellowGreen", "", 1, 0.20 )}
),
Dispatch( {}, "Summary Statistics", OutlineBox, {Close( 1 )} )
)
);
myTbLo = textBox(Char(round(myLimitMin, 2)) || " (OOC = " || char(0.00, 10, 2) || "%)");
myTbHi = textBox(Char(round(myLimitMax, 2)) || " (OOC = " || char(0.00, 10, 2) || "%)");
mySbDispObj = rangeSliderBox();
mySbDispObj = rangeSliderBox(
myLimitMin,
myLimitMax,
mylcl,
myucl,
//script
mySelectedLower = mySbDispObj << getLower;
mySelectedUpper = mySbDispObj << getUpper;
myGbDispObj << Dispatch( {}, "1", ScaleBox, {Add Ref Line( mySelectedLower, "Dashed", "blue", "LCL", 4 )} );
myGbDispObj << Dispatch( {}, "1", ScaleBox, {Add Ref Line( mySelectedUpper, "Dashed", "blue", "UCL", 4 )} );
rUpper = dt << Get Rows Where( myLimitCol[] > mySelectedUpper );
OOC_valUpper = (N Items(rUpper) / Col Number( Column(dt, "ColA") ))*100;
myTbHi << setText(Char(round(mySelectedUpper, 1)) || " (OOC = " || char(OOC_valUpper, 10, 2) || "%)");
rLower = dt << Get Rows Where( myLimitCol[] < mySelectedLower );
OOC_valLower = (N Items(rLower) / Col Number( Column(dt, "ColA") ))*100;
myTbLo << setText(Char(round(mySelectedLower, 1)) || " (OOC = " || char(OOC_valLower, 10, 2) || "%)");
);
mySbDispObj << Set Width( 275 );
myLayout = vListBox(
myGbDispObj,
hListBox(myTbLo, spacerBox(size(50,0)), myTbHi),
mySbDispObj
);
);@pmroz
@txnelson
谢谢你解释这个。
是的,我在 python 和 jsl 方面经验丰富。 随时随地学习。
OP,这可以相对容易地完成,但我认为没有多少人愿意帮助你,因为你要求太多而且似乎太缺乏经验而无法真正理解这一切。
在填写您的经验水平时需要注意的一些事项如下
- JSL 并没有真正做太多的自动范围控制——特别是,它不记得函数的范围状态和层次结构等等——如果你习惯了 Python,那么 JSL 会非常令人沮丧,并且会让你变得很棒痛苦,直到您将其内化并开始进行所有自己的范围控制
- 对于多个交互的和大部分相同的元素(例如带有滑块的图表,其中只有图表 X/Y / Grouping 正在改变),表达式不会很好地为您服务。改用函数发生器或其他东西,因为您需要区分滑块框及其链接到的对象。当然这可以用表达式来完成,但一般来说它是更复杂的设置,在大多数情况下速度增益可以忽略不计
- 从小处着手,只有一个图形和一个 rangeSliderBox。了解如何使用显式范围来链接它们
- 每个图都需要一个单独的数据表,因为一个表每行只能有一个行状态
- 有了这个,如果你为每个图创建多个子表,最好让它们不可见,以防止用户被数据表淹没。但请记住,数据表不会被 JMP 隐式删除.您需要将窗口的关闭与脚本的清理联系起来——关闭所有相关的数据表并删除任何用于范围界定的命名空间。
- 这里社区页面上的许多人都愿意提供帮助,但问题应该小而简洁。
这是一个影响某些参考线的示例,每个列表都有一个滑块框。 它不会删除先前的参考线,因此如果您要这样做,您必须弄清楚您想如何做到这一点。
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age)); // just some list
nw = new window("Some box");
for(i=1, i<=nitems(ages), i++,
olb = outlinebox("Age = " || char(ages[i]),
hlistbox(
rsb = rangesliderbox(colmin(:height), colmax(:height), colquantile(:height, .25), colquantile(:height, .75)),
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
where(char(:age) == ages[i])
);
)
);
(gb<<PARENT></PARENT>这些图表工作正常并附加到新窗口中。 但是我无法将范围滑块框()对象添加到使用循环创建的每个图形中;。
您可以尝试首先使用一个空列表框创建一个窗口,然后使用 for 循环将您的图表附加到该列表框。