Deshabilitar actualizaciones de gráficos con interacciónTengo 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.
Gráficossecuencias de comandosRe: Desactivar actualizaciones de gráficos con interacciónCreo 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).
Re: Desactivar actualizaciones de gráficos con interacciónEn mi humilde opinión, JMP realmente _MUY_ necesita urgentemente actualizar esta funcionalidad.Me he encontrado con este problema varias veces y, simplemente, no hay una solución alternativa válida.JMP solo debe volver a ejecutar el script de gráficos cuando algo cambia (como el tamaño del gráfico), no simplemente cuando se desplaza/cambia el tamaño de la ventana.
Dicho esto, descubrí que el método más rápido para hacer algo como esto es el que se muestra a continuación.Creo una ruta SVG (en mi experiencia, esta es sin duda la forma más rápida de representar rutas complejas en JMP) y tengo un centinela para determinar si reconstruir o no la ruta.He incluido un botón para forzar la reconstrucción de la ruta simplemente como ejemplo.
Espero que esto ayude, pero aún mejor sería que los desarrolladores de JMP proporcionaran un sistema que se comporte como todos los demás sistemas de gestión de pantalla (incluidos subprocesos múltiples, señales/ranuras, devoluciones de llamadas, etc.).
También he jugado con el uso de este método para tomar una imagen del renderizado deseado, verificar el tamaño del cuadro de gráficos y, si el tamaño no ha cambiado, usar la imagen guardada como elemento para mostrar.Esto es lo que debería estar haciendo JMP y nunca debería haberse configurado para ejecutar agresivamente el script de gráficos en cada oportunidad posible.Sin embargo, no he tenido mucha suerte con este método ya que JMP no proporciona las herramientas necesarias para que funcione correctamente.
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: Desactivar actualizaciones de gráficos con interacciónNo sabía que podía hacer una vectorización así en JSL. ¡Así que gracias por enseñarme ese método!
Una vez que muevo el cálculo de aleatoriedad fuera del cuadro del gráfico, los números no se actualizan, pero eso es engañoso. Solo puse la aleatoriedad para convencerme de que JMP estaba redibujando el gráfico. Entonces, aunque este método funcionó, no hizo exactamente lo que yo quería hacer. Una vez que introduje el cálculo de aleatoriedad en el cuadro del gráfico, todas las líneas seguían moviéndose. Pero definitivamente aprendí algo en el camino. ¡Gracias!
Además, todavía tenía que realizar un bucle forzado en el dibujo lineal porque no se suponía que mis líneas fueran caminos conectados. Por lo tanto, no podía simplemente crear un solo par de matrices x e y y pasarlas a Line o Line Seg.
Usé su código para que funcione con mi tabla de datos y está a continuación. Adjuntaré la tabla a este mensaje en caso de que alguien más necesite esta solución.
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] )
)
)
);