グラフ選択を JSL にリンクするにはどうすればよいですか?やあみんな!
私はアプリケーション ビルダーを使用しており、グラフ ビルダーを使用してスクリプトを作成したいくつかの異なるプロットがあります。 グラフの多くは、Python を使用して操作され、JMP に送り返されたさまざまなデータ テーブルを使用しています。 データは Python で重要な処理を経るため、これらのテーブルには同じ変数は含まれません。JSLを使用して、これらのグラフ上の選択項目を接続する方法を探しています(凡例ラベルの1つを選択すると、選択されていない項目が灰色表示される場合など)。
たとえば、生データと「最終製品」データをグラフ化しています。このデータでは、ディメンションが大幅に削減され、同様の特徴がグループ化されているため、Table1/Graph1 には 30 列があり、Table2/Graph2 には 3 列しかありません。 Table2 の変数を含むリスト ボックスがあり、Variable1 を選択した場合、Graph2 の Variable1 を強調表示できるだけでなく、Graph1 の関連情報も強調表示できるようにしたいと考えています。 ハイライトする関連する列/行を決定することはできますが、グラフ上でそれらの選択を実際に設定する方法を見つけることができませんでした。 また、グラフ上の凡例ラベルの 1 つを選択し (選択されていない項目は自動的にグレー表示されます)、他のグラフ上の関連情報を選択するようにスクリプトを作成できれば素晴らしいと思います。
このようなグラフ上で何かを強調表示するための JSL 線はありますか?
マスカスタマイゼーションRe: グラフ選択を JSL にリンクするにはどうすればよいですか?行状態ハンドラーは、すべての行状態の変更をトリガーします。 したがって、1 行を選択すると、(少なくとも) 2 つのイベントがトリガーされます。 1 つは選択解除、もう 1 つは選択です。 おそらくこれが何らかの問題を引き起こしており、簡単にループが発生する可能性があります。 特定のイベント (選択、選択解除、非表示、除外など) のみをキャプチャできれば、おそらく機能するでしょう。
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?そうか... 情報をありがとう! 行状態ハンドラーに関するこの章はもう終わりにしたいと思います (笑) ので、上記で提供した「<< グラフィックス スクリプトの追加」というアイデアをもう一度試してみることにしましたが、今回はフラグを使用します。 フラグなしで実装すると、上で扱ったのと同じ(悪い)動作を示すように見えますが、とフラグは機能するようです!
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
グラフィック接続を拡張しても、これが引き続き機能することを願っています。 行状態ハンドラーが「選択」を何度も繰り返し取得し続ける (その結果、グラフ間にループが作成され、JMP がフリーズする) のと、グラフィックス スクリプト内の同じ JSL が取得しないのはなぜなのか、何か考えはありますか?
本当に助かりました@jthi & @txnelson !
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?ある時点で、拡張ログに「役立つ」メッセージを生成するように管理

Re: グラフ選択を JSL にリンクするにはどうすればよいですか?Row State Handler に関しては、あまり面白くないことがいくつか起こっています (私の意見では、Row State Handler はそれほど悪く機能しないと考えているため、私は常にそれらを避けるようにしています)。 Big Class の単一行をクリックして、私が提供した例を実行してみて、JMP ログを確認してください。
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?それが私が試みてきたことですが、状態/行状態ハンドラー/フラグを十分に理解していないと思います。 上記で説明した内容のビデオを添付しました。 表示されているグラフは f2 と dt2 に関連しています。
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);最初は、ドラッグが完了するまで新しいポイントが追加されるたびに選択範囲が変化するため、ドラッグによって問題が発生しているのではないかと考えていましたが、ログの「group_selected」出力によると、選択範囲が変化しているようには見えません。 ループの原因は行状態ハンドラー内に新しい選択を追加したことであるように思えますが、両方のグラフ (そして最終的にはさらに多く) が相互に指すという目標を達成するためにこれを回避する方法がわかりません。
あらゆる提案を歓迎します。
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?Show() ステートメントを使用してログ内のフラグのステータスを表示し、ドラッグしてタイミングの問題がどこにあるのかを判断できるかどうかを確認します。
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?ご返信ありがとうございます。 @txnelson ! フラグを使用することは良いアイデアです。 残念ながら、まだ再帰の問題がいくつか発生しています... flag 変数のさまざまな場所をいじってみましたが、いじっている JSL についての理解が限られているので、この現在の構文が私にとって最も理にかなっています (疑似コードの構造とほぼ同じです)。これが私のものです:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />上記は、凡例のラベルをクリックして選択を行った場合 (やったー!)、プロット上の個々のマーカーをクリックして単一の選択を行った場合 (やったー!) は機能しますが、選択ペインをドラッグして選択しようとするとループに入ります。実際のプロット (これが私のユーザーの最も可能性の高いシナリオです) 上でのことです。私のフラグ変数は関数ごとに異なるはずですか? 現時点で、これまで説明したように動作させる唯一の方法は、同じフラグ変数を使用することです... 単に私が見落としているものがあるのでしょうか?
また、何もクリックせずにグラフの上にマウスを置くと、「already_run」フラグ変数がどういうわけか変更されるようです。 これは行状態ハンドラーの動作によるものでしょうか?
私はあなたの助けに感謝します!
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?同じデータ テーブルから生成されたすべてのグラフでは、いずれかのグラフで点や線などが選択されている場合、その点や線などが自動的に選択されます。
グラフが 2 つの異なるテーブルからのものである場合、各データ テーブルに対して行状態ハンドラーを構築できます。循環引数に関するあなたのステートメントは正しいですが、これをどのように処理したかは、各ハンドラーにサイクルの継続を防ぐフラグを設定することです。
これは、設定方法のヒントとなる簡単な疑似コードです。
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );Re: グラフ選択を JSL にリンクするにはどうすればよいですか?グラフ 1 の選択によりグラフ 2 の関連情報が強調表示されるように行状態ハンドラーを使用する方法はありますかと逆に? どちらかの方法で実行することはできますが、両方を実行したい場合は、JMP をフリーズさせる循環論議になるようです...循環引数を生じさせずに、両方のグラフ/データテーブルを他方を指す賢い方法はありますか?
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?グラフ ビルダー、二変量グラフなどで点または線が選択されると、その選択に関連付けられた行が、関連付けられたデータ テーブルで選択されます。これは、テーブルが表示されているかどうかには関係ありません。したがって、行の選択の変更が検出されるたびに実行される行状態ハンドラーを実装するのは非常に簡単です。
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?ご返信いただきありがとうございます。 @jthi ! グラフ上で選択された行/列/インデックスなどを単純に決定する方法がない限り、これらの解決策が私の場合に適用できるかどうかはわかりません。 私のアプリで使用されているデータテーブルはどれも、ユーザーが選択できるように表示されていません... このアイデアはビジュアライゼーションとインターフェイスすることだけであり、コードはテーブルに対するすべての操作を舞台裏で実行します。
グラフの選択には「<< Get Selected」を何度か繰り返す必要があるような気がしますが、スクリプトインデックスで適切な実装が見つかりませんでした。 そのための JSL 行がある場合は、選択が完了すると、あなたが言及した「<< グラフィックス スクリプトの追加」というアイデアがかなりうまく機能する可能性があると思います。
Re: グラフ選択を JSL にリンクするにはどうすればよいですか?私はアプリケーション ビルダーを使用したことがありませんが、行状態ハンドラーを使用できる可能性があります。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
他のオプションとしては、グラフ スクリプトを使用することもできます。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
もう 1 つのオプションは仮想結合を使用することですが、これにはデータ テーブルをどこかに保存する必要があります。