我有一個代碼“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
@tx尼爾森
謝謝你的解釋。
是的,我對 python 有經驗,但對 jsl 很陌生。 隨時隨地學習。
OP,這可以相對容易地完成,但我認為沒有多少人願意幫助你,因為你要求太多,而且似乎太缺乏經驗,無法真正理解這一切。
當您在此處填寫經驗級別時需要考慮以下事項
- JSL 並沒有真正做太多的自動作用域控制——特別是,它不記得函數的作用域狀態和層次結構等等——如果你習慣了 Python,那麼 JSL 將會非常令人沮喪,並且會讓你感覺很棒痛苦,直到你內化這一點並開始進行所有你自己的範圍控制
- 對於多個交互的和大多數相同的元素(例如帶有滑塊框的圖表,其中只有圖表 X/Y / 分組正在變化),表達式將無法很好地為您服務。請使用函數生成器或其他東西,因為您需要區分滑塊框以及它們鏈接到的對象。當然,這可以通過表達式來完成,但一般來說,這是更複雜的設置,在大多數情況下速度增益可以忽略不計
- 從小處開始,只有一張圖表和一個 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>這些圖表工作正常並附加到新窗口中。 但我無法將範圍滑塊 box() 對象添加到使用循環創建的每個圖形中;。
您可以嘗試首先創建一個窗口,其中包含一個要放置圖形的空列錶框,然後使用 for 循環將圖形附加到該列錶框。