「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるこんにちは、コミュニティの皆さん!
長い間、私は次のような、フィットグループで二変量プロットを描くスクリプトを使用していました。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
ここで重要なのは、文字列のリストの形式でパラメータのリストを取得し、それらを 1 つずつプロットすることです。
ここで、Graph Builder にはあって Bivariate にはないいくつかの機能があるため、Bivariate Plot から Graph Builder に切り替える必要があります。
グラフビルダーのプロットを二変量プロットと全く同じように表示する方法を見つけましたが、フィットグループで上図のようにGBを描画する簡単な方法があるかどうかわかりません。フィットグループではGBを以下のように設定できるようです。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
しかし、任意のパラメータリストを扱うには、ループスクリプトで記述する必要があります。もっとシンプルなもの(もちろん動作しませんが)を期待していました。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
GB がパラメータのリストを取得して DisplayBox のリストを出力する方法はありますか?
自動化とスクリプトRe: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるかなり近かったです。ループでスクリプト化する必要があります。以下の方法はうまくいくようです。列のリストをGUI出力に置き換えるか、GUIスクリプトに慣れていない場合は、「選択された列を取得する」スクリプトを作成し、プロットする列を選択して、プログラムでリストに変換するという方法もあります。
グラフビルダーの強みはインタラクティブ性です。そのため、ウィンドウに複数のグラフを表示する場合、それぞれを変更する必要があるため(変更が必要になると仮定した場合)、あまり最適ではありませんが、スクリプトを使用すれば(ほぼ)簡単に変更できるようになります。
私が持っている方法の一つは、y by xやGBなど複数のプラットフォームに出力するスクリプトを使うことです。ただし、このスクリプトは列スイッチャーも生成します。そして、列スイッチャーリストの各出力をジャーナルにプロットするボタンがあります。もちろん、インタラクティブ性はありません。
とにかく、少し修正したスクリプトは次のとおりです
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるグラフビルダーでは、同様の効果を得るにはページを使用しますが、もちろんデータが特定の形式である必要があります。または列スイッチャーを使用します。
ページが使用できない場合は、グラフビルダーの「フィットグループ」を削除することを検討してください。グラフを「ラインアップボックス」に集めて、簡単に行にグループ化できるようにします。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
各行のレポート数を変更したい場合は、Lineup Boxで変更できます。
<< N Col(1);
必要に応じて、最上位レベルのアウトライン ボックスにスクリプトを追加できます。
Fit Group を使うこともできますが、式の処理が必要になります。頻繁に行う必要がある場合は、関数を作成して自動で処理させることもできます。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換える私が抱えている制約は次のとおりです。
このスクリプトはアドインの一部です。現在、入力はテキスト文字列(GUIで生成)内の列リストとして受け付けられます。
そして、インタラクティブ性は必要ありません。顧客と合意したプロットの正確な形式が必要です。
Fit Y by Xではエラーバーを簡単に表示できないようなので、GBに切り替えます。顧客から突然、プロットにエラーバーを表示したいと要望がありました。
質問は、単一のGBではなく、GBのリストを作成する最も効率的な方法です。Fit GroupやFit Y by Xと同じように、ドキュメントには記載されていない機能があればいいなと思っています。
しかし、ループをスクリプト化する必要があるようです。
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるLine Up Box に切り替えないといけないようです。コードに大きな変更が必要になるので、切り替えたくなかったのですが、スクリプト式を使うのは本当に嫌なんです。ただ、以下の点だけ期待しています。
1. このフィットグループの特定の機能をコードの他の場所で使用しない
2. 出力では Fit Group とまったく同じように見えるようになります。
ただし、最終出力のサンプルコードを示します。
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるあなたへの質問です。
明らかなタイプミスを修正すると、スクリプトは完全に正常に動作します。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
これで 'lub' に問題なく追加されます。
最初に提案していただいたスクリプトを、少し異なる形と形式で書き直しました。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
私の場合、「listOfGBs」も次のように表示されます。
{Graph Builder[], Graph Builder[]}
しかしその後オンラインで:
lub << Append( listOfGBs );
エラーが発生します:
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
理由が分かりますか?
いろいろ試してみますが、GB を関数内に保持しておきたいと思います。
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるこれを実行するとすぐにスクリプトの動作が停止します。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
グラフビルダーの式を直接使用しても、それを表す変数を使用しても、意味的には違いはないはずです。それが私の理解です。なぜスクリプトが壊れるのでしょうか?
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるはい、この形式で動作します:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
関数(私のやり方)と表現(実質的にはあなたのやり方)の両方を使用できます。
以前の問題が何であったかはわかりませんが、どうやら関数内で LineUp Box を作成し、GB オブジェクトではなくそれを返す必要があるようです。
Re: 「フィットグループ」で「二変量」を「グラフビルダー」に置き換えるラインナップボックスにグラフビルダーではなくリストを追加しています。スクリプトを次のように修正してください。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
グラフを作成する際には、少し注意が必要です。式をいじってみれば通常は回避できますが、式を自分で構築する必要があります。また、参照を収集する必要がなければ、挿入する必要がないため、少し簡単になります。参照は後で<< XPathを使って取得できます。
もっと見る...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;