我有一個代碼“sample.jsl”,它有一個循環來為每列創建一個雙變量圖。 我正在嘗試向此循環添加一個範圍滑塊框,以便一旦我運行腳本,它就會為所有列創建一個圖形,每個圖形都有單獨的範圍滑塊框。
所有 x 軸列的限制在“limits.jmp”中,數據文件在“Data.jmp”中。 代碼“sample.jsl”一次為所有參數創建一個圖。 我想修改代碼,以便它還為所有圖形添加一個範圍滑塊框。
範圍滑塊框應具有控制上限 (ucl) 和 lcl 作為兩個動態滑塊。
我有這段代碼可以創建範圍滑塊框,但它只適用於單個圖形。 我需要一個腳本來創建所有圖形以及動態範圍滑塊框。
@txnelson
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
您可以嘗試先創建一個帶有您希望圖形所在的空列錶框的窗口,然後使用 for 循環將您的圖形附加到該列錶框。
圖表工作正常並附加到新窗口中。 但是我無法向使用循環創建的每個圖形添加範圍滑塊 box() 對象;。
這是一個影響某些參考線的示例,每個列表都有一個滑塊框。 它不會刪除先前的參考線,因此如果您要這樣做,您必須弄清楚您想如何做到這一點。
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>OP,這可以相對容易地完成,但我認為沒有多少人願意幫助你,因為你要求太多而且似乎太缺乏經驗而無法真正理解這一切。
在填寫您的經驗水平時需要注意的一些事項如下
- JSL 並沒有真正做太多的自動範圍控制——特別是,它不記得函數的範圍狀態和層次結構等等——如果你習慣了 Python,那麼 JSL 會非常令人沮喪並且讓你很棒痛苦,直到您將其內化並開始進行所有自己的範圍控制
- 對於多個交互的和大多數相同的元素(例如帶有滑塊的圖表,其中只有圖表 X/Y / Grouping 發生變化),表達式不會很好地為您服務。改用函數發生器或其他東西,因為您需要區分滑塊框以及它們鏈接到的對象。當然這可以用表達式來完成,但一般來說,它是更複雜的設置,在大多數情況下速度增益可以忽略不計
- 從小處著手,只有一個圖表和一個 rangeSliderBox。了解如何使用顯式範圍來鏈接它們
- 每個圖都需要一個單獨的數據表,因為一個表每行只能有一個行狀態
- 有了這個,如果你為每個圖創建多個子表,最好讓它們不可見,以防止用戶被數據表淹沒。但請記住,數據表不會被 JMP 隱式刪除.您需要將窗口的關閉與腳本的清理聯繫起來——關閉所有相關的數據表並刪除任何用於範圍界定的命名空間。
- 這里社區頁面上的許多人都願意提供幫助,但問題應該小而簡潔。