こんにちは、
Graph Builder へのスクリプト作成はひどい経験だと感じています (しばらくの間、JMP のスクリプト作成を行ってきました)。 直感的ではないようですし、必要な具体的なヘルプも見つからないようです。 そこで私は白旗を振ってグループに問いかけます。
私のスクリプトは正しい列 (数が異なる) を取得し、2 つのネストされた X レベルを持つグラフ ビルダーをすべて適切に作成します。 問題は、私が与えた最初の変数は正しく点であるにもかかわらず、何らかの理由でグラフ ビルダーが他のすべての変数に箱ひげ図を割り当てていることです (これは私のスクリプトのどこにも見当たりません)。 そこで、すべての y 変数をポイントに変換する簡単な方法を探しています。 要素をループする必要があると思われますが、それを適切に行う方法を見つけることができれば、とてもうれしいです。
考えは? また、グラフ ビルダーの詳細なスクリプト作成に関する適切なリファレンスを持っている人はいますか?
ティア! フレッド
はい。 同意します。 これは私もこれを学習するためのアプローチでしたが、他のスクリプトと比べて驚くほどイライラします。 さらなる議論のための熟した領域です!
助けてくれてありがとう。 私は次のアプローチを採用しました(反復により...多くの失敗がありました!)。
1. グラフに追加したい列名のリストがあります。 これはリスト「a」にあります (表示されていません)。 それをプロットしたいのです。
2. 検索リストに一致するデータ テーブルの列からリストを作成します。 これらは、プロットできる存在する Y 軸変数です。
3. グラフ ビルダーを構築し、ネストされた変数を使用して X 軸を設定します。 これは私のすべてのデータに共通です。
4. 次にループして変数を追加します。
5. 次に、ループして要素を追加します。
6. 次に、ループしてグリッド線を追加します。 そして最後にタイトル。
ステップ 4 ~ 6 については、これらの作業を 1 つのループ内で実行しようとすると、JMP がクラッシュし続けました。 そうやってここまで来ました。 スクリプトは機能しますが (いくつかのマイナーな機密情報を引き出す必要がありました)、高速ではありません。
私がプログラムした他の JSL と比較すると、これはかなりぎこちないです。 これほど多くの JMP クラッシュが発生したのは初めてです。 しかし、それはうまくいきます。
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);グラフ ビルダーの JSL スクリプトは理解するのが簡単ではありません。私のアプローチは、好みに合わせてグラフを微調整し、赤い三角形をクリックして結果のスクリプトを取得することです。
ただし、動的な数の Y 変数がある場合は、2 つまたは 3 つの Y 変数のスクリプトを取得し、パターンの GB スクリプトを調べることができます。次に、それを拡張するにはn Y 変数を使用すると、実行する gb スクリプトを含む文字列を動的に構築し、それを eval(parse(gb_string)) で実行します。
ここでは式を使用する 1 つの方法を示します。 この場合、完全に制御でき、起動式全体を一度に作成できるため、このアプローチが気に入っています。
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
この答えが完全な解決策ではないことは承知しています。 解決策を試みるのに十分な情報が提供されていません。 また、自分で解決する方法を学ぶことをお勧めします。 これは、あなたにとって効果的なアプローチを説明することを目的としています。
Y ロールで複数の列をプロットしていますか、それとも列ごとに 1 つずつ複数のグラフ ビルダー オブジェクトを使用していますか?
まあ、少しの回避策は見つかりましたが、間違いなく不安定です。
私は終わりました:
- 必要なネストされた x 変数を使用して最初のグラフを作成しますが、Y 変数は使用しません。
- 次に、ループを実行して Y 変数を追加します。
- 次に、別のループを追加して各 Y の要素を削除し、ポイントを持つ各 Y に新しい要素を追加します。
- 次に、別のループを追加して、各 Y にグリッド線を追加します。
ほぼすべてのステップの間に Wait(1) があります。 最初に、各変数に対してそれぞれの処理を実行する単一のループを試しましたが、これまでに約 10 回、JMP Complete がクラッシュしました。 トラブルシューティングを行った結果、上記のフォームが表示されました。
したがって、これは機能しますが、正しくコーディングされていない場合に JMP がクラッシュするのは気に入らないと思います。 そして、誰かがグラフ ビルダー スクリプトに関する確かなリファレンスを教えてくれたことに感謝します。 前もって感謝します!フレッド