Disabilita gli aggiornamenti del grafico con l'interazioneHo 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.
GraficaSceneggiaturaRe: Disabilita gli aggiornamenti del grafico con l'interazionePenso 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.)
Re: Disabilita gli aggiornamenti del grafico con l'interazioneIMHO JMP ha davvero davvero _MOLTO_ bisogno di aggiornare questa funzionalità.Mi sono imbattuto in questo problema più volte e, semplicemente, non esiste una soluzione valida.JMP dovrebbe rieseguire lo script grafico solo quando qualcosa cambia (come la dimensione del grafico), non semplicemente quando si scorre/modifica la dimensione della finestra.
Detto questo, ho scoperto che il metodo più veloce per fare qualcosa del genere è quello mostrato di seguito.Creo un percorso SVG (nella mia esperienza questo è senza dubbio il modo più veloce per eseguire il rendering di percorsi complessi in JMP) e ho una sentinella per determinare se ricostruire o meno il percorso.Ho incluso un pulsante per forzare la ricostruzione del percorso semplicemente come esempio.
Spero che questo aiuti, ma sarebbe ancora meglio che gli sviluppatori JMP forniscano un sistema che si comporti come tutti gli altri sistemi di display manager (inclusi multi-thread, segnale/slot, callback, ecc...).
Ho anche giocato con questo metodo per catturare un'immagine del rendering desiderato, controllare le dimensioni della casella grafica e, se le dimensioni non sono cambiate, utilizzare l'immagine salvata come cosa da mostrare.Questo è ciò che JMP dovrebbe fare e non dovrebbe mai essere configurato per eseguire in modo aggressivo lo script grafico in ogni possibile opportunità.Tuttavia, non ho avuto molta fortuna con questo metodo poiché JMP non fornisce gli strumenti necessari per farlo funzionare correttamente
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: Disabilita gli aggiornamenti del grafico con l'interazioneNon sapevo di poter fare vettorizzazione del genere in JSL. Quindi grazie per avermi insegnato quel metodo!
Una volta spostato il calcolo della casualità fuori dalla casella del grafico, i numeri non si aggiornano, ma è fuorviante. Ho inserito la casualità solo per convincermi che JMP stesse ridisegnando il grafico. Quindi, mentre questo metodo ha funzionato, non ha fatto esattamente quello che volevo fare. Una volta inserito il calcolo della casualità nella casella del grafico, tutte le linee si muovevano ancora. Ma ho sicuramente imparato qualcosa lungo la strada. Grazie!
Inoltre, dovevo ancora eseguire il ciclo del disegno della linea perché le mie linee non dovevano essere percorsi collegati. Quindi, non potevo semplicemente creare una singola coppia di matrici xey e passarle a Line o Line Seg.
Ho usato il tuo codice per farlo funzionare con la mia tabella di dati ed è qui sotto. Allegherò la tabella a questo messaggio nel caso qualcun altro abbia bisogno di questa soluzione.
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] )
)
)
);