Tengo una tabla de datos con columnas ox, oy, dx y dy. Para fines de demostración, puede suponer que todas las columnas son aleatorias con la fórmula: Random Normal(0, 10). El verdadero problema es una red con una lista de coordenadas.
Me gustaría dibujar líneas entre (ox, oy) y (dx, dy) y puedo hacerlo con Graph Builder o Graph Box (ejemplo a continuación). Sin embargo, con cada interacción, JMP vuelve a dibujar las líneas, lo que hace que mi visualización sea muy lenta (tengo más de 10 000 filas en la tabla de datos). Probé esto agregando una pequeña parte aleatoria a las coordenadas de origen y destino en el script del gráfico y tan pronto como haya alguna interacción (por ejemplo, usando la herramienta Grabber y arrastrando el lienzo, ajustando los ejes, cambiando el tamaño del gráfico, cambiando el tamaño de la ventana), las líneas cambian. ¿Hay alguna manera de evitar que JMP actualice el gráfico y vuelva a ejecutar los scripts?
No pude encontrar una manera en Graph Builder (preferiría usar esta plataforma) o Graph Box. Encontré la
<< Graph Updating( Per Mouse Up );
mensaje pero solo tiene dos opciones; no hay opción de "no actualizar" que yo sepa. Además, creo que ese mensaje no funciona con Graph Box de todos modos.
Aquí hay un ejemplo mínimo de Graph Box que puede dibujar líneas, pero las líneas se actualizan con cada interacción:
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);
);
);
);Recordatorio, solo agregué Random Normal en ese script de Graph Box solo para ver si las líneas se están recalculando. El problema real tiene coordenadas fijas.
Pregunta adicional: ¿hay alguna manera de agregar líneas después de que se haya construido el cuadro del gráfico? No pude encontrarlo en los ejemplos. Teoricé que tal vez no se actualizarán con cada interacción del mouse, pero no pude probarlo.
Creo que el problema es que el cuadro de marco se actualizará automáticamente cada vez que haya un cambio, por lo que es mejor realizar todos los cambios antes de renderizar. Además, también puede vectorizar las operaciones para la velocidad, en lugar de iterar explícitamente con la función For(). Los segmentos gráficos también ofrecen algunas ventajas, pero actualmente están mal documentados.
Vea este enfoque:
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
(No tengo su tabla de datos, así que no pude probarla, pero aun así debería ilustrar el enfoque).