Ho una tabella dati con colonne ox, oy, dx e dy. A scopo dimostrativo, puoi presumere che tutte le colonne siano casuali con la formula: Random Normal(0, 10). Il vero problema è una rete con un elenco di coordinate.
Vorrei tracciare linee tra (ox, oy) e (dx, dy) e posso farlo con Graph Builder o Graph Box (esempio sotto). Tuttavia, ad ogni interazione, JMP ridisegna le linee, il che rende la mia visualizzazione molto lenta (ho > 10 000 righe nella tabella dei dati). L'ho testato aggiungendo una piccola parte casuale alle coordinate di origine e destinazione nello script del grafico e non appena c'è un'interazione (ad esempio, usando lo strumento Grabber e trascinando la tela, regolando gli assi, ridimensionando il grafico, ridimensionando la finestra), le linee cambiano. C'è un modo per impedire a JMP di aggiornare il grafico e di rieseguire gli script?
Non sono riuscito a trovare un modo in Graph Builder (preferirei usare questa piattaforma) o Graph Box. Ho trovato il
<< Graph Updating( Per Mouse Up );
messaggio ma ha solo due opzioni; non c'è l'opzione "non aggiornare" per quanto posso dire. Inoltre, penso che quel messaggio non funzioni comunque con Graph Box.
Ecco un esempio di Graph Box minimo che può disegnare linee ma le linee vengono aggiornate ad ogni interazione:
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);
);
);
);Promemoria, ho aggiunto solo il Random Normal in quello script Graph Box solo per vedere se le linee vengono ricalcolate. Il vero problema sono le coordinate fisse.
Domanda bonus: c'è un modo per aggiungere linee dopo che la casella del grafico è stata costruita? Non sono riuscito a trovarlo negli esempi. Ho teorizzato che forse non verranno aggiornati ad ogni interazione del mouse ma non ho potuto testarlo.
Penso che il problema sia che la cornice si aggiornerà automaticamente ogni volta che c'è una modifica, quindi è meglio apportare tutte le modifiche prima del rendering. Inoltre, puoi vettorializzare le operazioni anche per la velocità, invece di iterare esplicitamente con la funzione For(). Anche i segmenti grafici offrono alcuni vantaggi, ma al momento sono scarsamente documentati.
Vedi questo approccio:
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
(Non ho la tua tabella di dati, quindi non ho potuto testarla, ma dovrebbe comunque illustrare l'approccio.)