コード「sample.jsl」には、列ごとに二変数プロットを作成するループがあります。 このループにレンジ スライダー ボックスを追加して、スクリプトを実行すると、グラフごとに個別のレンジ スライダー ボックスを持つすべての列に対して 1 つのグラフが作成されるようにしようとしています。
すべての X 軸列の制限は「limits.jmp」にあり、データファイルは「Data.jmp」です。 コード「sample.jsl」は、すべてのパラメーターに対して一度に 1 つのグラフを作成します。 コードを変更して、すべてのグラフにレンジ スライダー ボックスも追加したいと考えています。
範囲スライダー ボックスには、2 つの動的スライダーとして上方管理限界 (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 / グループ化のみが変化するもの) の場合、式は役に立ちません。スライダー ボックスとそれがどのオブジェクトにリンクしているかを区別する必要があるため、代わりにファンクション ジェネレーターなどを使用してください。もちろん、これはエクスプレッションを使用して行うこともできますが、一般的には、より複雑な設定となり、ほとんどの状況で速度の向上は無視できる程度になります。
- グラフと rangeSliderBox を 1 つだけ使用して、小規模から始めます。明示的なスコープ設定を使用してそれらをリンクする方法を学びます
- テーブルには行ごとに 1 つの行状態しか含めることができないため、プロットごとに個別のデータ テーブルが必要になります。
- これにより、プロットごとに複数のサブテーブルを作成する場合は、ユーザーにデータ テーブルがあふれないようにするためにサブテーブルを非表示にすることが最善です。ただし、データテーブルに注意してください。 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>グラフは正常に動作し、新しいウィンドウに追加されます。 しかし、loop; を使用して作成された各グラフにレンジ スライダー box() オブジェクトを追加することはできません。
まず、グラフを配置する空のリスト ボックスを含むウィンドウを作成してから、for ループを使用してそのリスト ボックスにグラフを追加してみるとよいでしょう。