ox、oy、dx、dyの各列を持つデータテーブルがあります。 デモンストレーションの目的で、すべての列が式Random Normal(0、10)でランダムであると想定できます。 本当の問題は、座標のリストを持つネットワークです。
(ox、oy)と(dx、dy)の間に線を引きたいのですが、これはGraphBuilderまたはGraphBox(以下の例)のいずれかを使用して行うことができます。 ただし、対話のたびに、JMPは線を再描画するため、視覚化が非常に遅くなります(データテーブルに> 10,000行あります)。 グラフスクリプトの起点と終点の座標に小さなランダムな部分を追加し、相互作用が発生したらすぐにこれをテストしました(たとえば、グラバーツールを使用してキャンバスをドラッグし、軸を調整し、グラフのサイズを変更し、ウィンドウのサイズを変更します)。線は変わります。 JMPによるグラフの更新とスクリプトの再実行を停止する方法はありますか?
グラフビルダー(このプラットフォームを使用したい)またはグラフボックスで方法を見つけることができませんでした。 私は見つけました
<< Graph Updating( Per Mouse Up );
メッセージですが、2つのオプションしかありません。私の知る限り、「更新しない」オプションはありません。 また、とにかくメッセージはグラフボックスでは機能しないと思います。
線を描くことができる最小限のグラフボックスの例を次に示しますが、線はすべてのインタラクションで更新されます。
New Window( "Example",
Graph Box(
Frame Size( 300, 300 ),
Pen Color( "Blue" );
o_x = :ox << Get Values();
o_y = :oy << Get Values();
d_x = :dx << Get Values();
d_y = :dy << Get Values();
For( i=1, i<=N Items(o_x), i++,
origin = Eval List({o_x[i]*Random Normal( 1, 0.1 ), o_y[i]*Random Normal( 1, 0.1 )});
destination = Eval List({d_x[i]*Random Normal( 1, 0.1 ), d_y[i]*Random Normal( 1, 0.1 )});
Line(origin, destination);
);
);
);注意:線が再計算されているかどうかを確認するために、そのグラフボックススクリプトにランダム正規分布を追加しただけです。 本当の問題は固定された座標です。
ボーナスの質問:グラフボックスが作成された後に線を追加する方法はありますか? 例では見つかりませんでした。 私は、マウスを操作するたびに更新されるわけではないかもしれないと理論付けましたが、テストすることはできませんでした。
問題は、変更があるたびにフレームボックスが自動的に更新されることだと思います。したがって、レンダリングする前にすべての変更を行うのが最善です。 また、For()関数で明示的に反復する代わりに、速度のために操作をベクトル化することもできます。 グラフィックセグメントにもいくつかの利点がありますが、現時点では十分に文書化されていません。
このアプローチを参照してください。
Names Default to Here( 1 );
// origin
o_x = :ox << Get As Matrix;
o_y = :oy << Get As Matrix;
// destination
d_x = :dx << Get As Matrix;
d_y = :dy << Get As Matrix;
n = N Items( o_x );
// vectorize for line segments
seg = (o_x :*</img> J( n, 1, Random Normal( 1, 0.1 ))) || (o_y f:* J( n, 1, Random Normal( 1, 0.1 ))) ||
(d_x :*</img> J( n, 1, Random Normal( 1, 0.1 ))) || (d_y f:* J( n, 1, Random Normal( 1, 0.1 )));
// plot segments
New Window( "Example",
gb = Graph Box(
Frame Size( 300, 300 ),
Pen Color( "Blue" );
Line Seg( seg );
)
);
// later, update seg, then send gb << Reshow message to graph box
(私はあなたのデータテーブルを持っていないので、それをテストすることはできませんでしたが、それでもアプローチを説明する必要があります。)