相互作用を伴うグラフ更新を無効にする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);
);
);
);注意:線が再計算されているかどうかを確認するために、そのグラフボックススクリプトにランダム正規分布を追加しただけです。 本当の問題は固定された座標です。
ボーナスの質問:グラフボックスが作成された後に線を追加する方法はありますか? 例では見つかりませんでした。 私は、マウスを操作するたびに更新されるわけではないかもしれないと理論付けましたが、テストすることはできませんでした。
グラフィックススクリプティングRe:インタラクションによるグラフの更新を無効にする問題は、変更があるたびにフレームボックスが自動的に更新されることだと思います。したがって、レンダリングする前にすべての変更を行うのが最善です。 また、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
(私はあなたのデータテーブルを持っていないので、それをテストすることはできませんでしたが、それでもアプローチを説明する必要があります。)
Re:インタラクションによるグラフの更新を無効にするIMHO JMPは、本当に_VERY_この機能を更新する必要があります。私はこの問題に何度も遭遇しましたが、非常に単純に、有効な回避策はありません。JMPは、ウィンドウのサイズをスクロール/変更するときだけでなく、何かが変更されたとき(グラフのサイズなど)にのみグラフィックスクリプトを再実行する必要があります。
そうは言っても、このようなことを行うための最速の方法は以下のとおりです。私はSVGパスを作成し(私の経験では、これはJMPで複雑なパスをレンダリングするための最速の方法です)、パスを再構築するかどうかを決定するための番兵を持っています。例として、パスの再構築を強制するボタンを含めました。
これがお役に立てば幸いですが、JMP開発者は、他のすべてのディスプレイマネージャーシステム(マルチスレッド、シグナル/スロット、コールバックなどを含む)と同じように動作するシステムを提供することをお勧めします。
また、この方法を使用して目的のレンダリングの画像を取得し、グラフィックボックスのサイズを確認し、サイズが変更されていない場合は、保存した画像を表示対象として使用します。これはJMPが行うべきことであり、あらゆる機会にグラフィックスクリプトを積極的に実行するように設定されるべきではありませんでした。ただし、JMPはこれを適切に機能させるために必要なツールを提供していないため、この方法にはあまり幸運がありませんでした。
self = New Namespace();
self:table = Current Data Table();
self:redraw = 1;
self:path = "";
self:build path = Function( {},
{Default Local},
self:path = "";
For Each Row( self:table,
self:path ||= Eval Insert( "\[M^:ox * Random Normal( 1, 0.1 )^,^oy * Random Normal( 1, 0.1)^ L^dx * Random Normal( 1, 0.1 )^,^:dy * Random Normal( 1, 0.1 )^]\" )
);
);
Eval( Eval Expr(
New Window( "Example",
<<ON close=""></ON>
Re:インタラクションによるグラフの更新を無効にするJSLでそのようなベクトル化ができるとは知りませんでした。 だから私にその方法を教えてくれてありがとう!
ランダム性の計算をグラフボックスの外に移動すると、数値は更新されませんが、それは誤解を招く恐れがあります。 JMPがグラフを再描画していることを自分自身に納得させるために、ランダム性を入れただけです。 したがって、この方法は機能しましたが、私がやりたいことを完全には実行しませんでした。 ランダム性の計算をグラフボックスに取り込むと、すべての線がまだ動き回っていました。 しかし、私は間違いなく途中で何かを学びました。 ありがとう!
また、線が接続されたパスであると想定されていなかったため、線画をforループする必要がありました。 したがって、x行列とy行列の単一のペアを作成して、それらをLineまたはLineSegに渡すことはできませんでした。
私はあなたのコードを使ってそれを私のデータテーブルで動作させました、そしてそれは以下にあります。 他の誰かがこの解決策を必要とする場合に備えて、このメッセージに表を添付します。
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 );
// plot segments
New Window( "Example",
gb = Graph Box(
Frame Size( 300, 300 ),
Pen Color( "Blue" );
seg_x = (o_x :*</img> J( n, 1, Random Normal( 1, 0.1 ) )) || (d_x :*</img> J( n, 1, Random Normal( 1, 0.1 ) ));
seg_y = (o_y :*</img> J( n, 1, Random Normal( 1, 0.1 ) )) || (d_y :*</img> J( n, 1, Random Normal( 1, 0.1 ) ));
For( i=1, i<=n, i++,
Line( seg_x[i, -1], seg_y[i, -1] )
)
)
);