各列の2変数プロットを作成するループを持つコード「sample.jsl」があります。 このループに範囲スライダーボックスを追加しようとしています。スクリプトを実行すると、すべての列に対して1つのグラフが作成され、グラフごとに個別の範囲スライダーボックスが作成されます。
すべてのx軸列の制限は「limits.jmp」にあり、データファイルは「Data.jmp」です。 コード「sample.jsl」は、すべてのパラメーターに対して一度に1つのグラフを作成します。 すべてのグラフに範囲スライダーボックスも追加するように、コードを変更したいと思います。
範囲スライダーボックスには、2つの動的スライダーとして上限管理限界(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 /グループ化のみが変更されます)では、式はうまく機能しません。スライダーボックスとそれらがリンクするオブジェクトを区別する必要があるため、代わりに関数発生器などを使用してください。もちろん、これは式を使用して行うことができますが、一般的には、ほとんどの状況で速度の向上がごくわずかである、より複雑なセットアップです。
- 1つのグラフと1つのrangeSliderBoxだけで、小さく始めます。明示的なスコープを使用してそれらをリンクする方法を学ぶ
- テーブルは行ごとに1つの行状態しか持てないため、プロットごとに個別のデータテーブルが必要になります。
- これにより、プロットごとに複数のサブテーブルを作成する場合は、ユーザーがデータテーブルで溢れるのを防ぐために、それらを非表示にするのが最適です。ただし、そのデータテーブルに注意してくださいJMPによって暗黙的に削除されることはありません。ウィンドウの終了をスクリプトのクリーンアップに関連付ける必要があります。関連するすべてのデータテーブルを閉じ、スコープに使用されている名前空間をすべて削除します。
- ここのコミュニティページの多くの人々は喜んで助けてくれますが、質問は小さく簡潔でなければなりません。