Désactiver les mises à jour des graphiques avec interactionJ'ai une table de données avec des colonnes ox, oy, dx et dy. À des fins de démonstration, vous pouvez supposer que toutes les colonnes sont aléatoires avec la formule : Random Normal(0, 10). Le vrai problème est un réseau avec une liste de coordonnées.
Je voudrais tracer des lignes entre (ox, oy) et (dx, dy) et je peux le faire avec Graph Builder ou Graph Box (exemple ci-dessous). Cependant, à chaque interaction, JMP redessine les lignes, ce qui rend ma visualisation très lente (j'ai > 10 000 lignes dans la table de données). J'ai testé cela en ajoutant une petite partie aléatoire aux coordonnées d'origine et de destination dans le script graphique et dès qu'il y a une interaction (par exemple, en utilisant l'outil Grabber et en faisant glisser le canevas, en ajustant les axes, en redimensionnant le graphique, en redimensionnant la fenêtre), les lignes changent. Existe-t-il un moyen d'empêcher JMP de mettre à jour le graphique et de réexécuter les scripts ?
Je n'ai pas trouvé de moyen dans Graph Builder (je préférerais utiliser cette plate-forme) ou Graph Box. J'ai trouvé le
<< Graph Updating( Per Mouse Up );
message mais il n'a que deux options; il n'y a pas d'option "ne pas mettre à jour" pour autant que je sache. De plus, je pense que ce message ne fonctionne pas avec Graph Box de toute façon.
Voici un exemple minimal de boîte graphique qui peut tracer des lignes, mais les lignes sont mises à jour à chaque interaction :
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);
);
);
);Rappel, j'ai seulement ajouté le Random Normal dans ce script Graph Box juste pour voir si les lignes sont recalculées. Le vrai problème a des coordonnées fixes.
Question bonus : existe-t-il un moyen d'ajouter des lignes après la construction de la boîte graphique ? Je ne l'ai pas trouvé dans les exemples. J'ai émis l'hypothèse qu'ils ne seraient peut-être pas mis à jour à chaque interaction avec la souris, mais je n'ai pas pu le tester.
Automatisation et scriptFusion et nettoyage des donnéesPersonnalisation de masseRe : Désactiver les mises à jour des graphiques avec interactionC'est une idée vraiment intéressante. Malheureusement, avec les points 20K, le chemin devait passer avec les mouvements et les lignes, les graphismes se débattaient encore plus et c'était encore plus lent.
Mais je garderai cela à l'esprit pour les problèmes futurs car j'aime l'idée qu'il n'y a techniquement qu'un seul chemin ici et qu'aucune boucle n'est nécessaire dans le code graphique.
Re : Désactiver les mises à jour des graphiques avec interactionJe ne savais pas que je pouvais faire de la vectorisation comme ça en JSL. Alors merci de m'avoir appris cette méthode !
Une fois que j'ai déplacé le calcul du caractère aléatoire hors de la zone graphique, les chiffres ne sont pas mis à jour, mais c'est trompeur. Je n'ai mis le hasard que pour me convaincre que JMP redessinait le graphique. Donc, bien que cette méthode ait fonctionné, elle n'a pas tout à fait fait ce que je voulais faire. Une fois que j'ai inséré le calcul du caractère aléatoire dans la zone graphique, toutes les lignes se déplaçaient encore. Mais j'ai certainement appris quelque chose en cours de route. Merci!
De plus, je devais encore boucler le dessin au trait car mes lignes n'étaient pas censées être des chemins connectés. Donc, je ne pouvais pas simplement créer une seule paire de matrices x et y et les passer à Line ou Line Seg.
J'ai utilisé votre code pour le faire fonctionner avec ma table de données et c'est ci-dessous. Je joindrai le tableau à ce message au cas où quelqu'un d'autre aurait besoin de cette solution.
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] )
)
)
);
Re : Désactiver les mises à jour des graphiques avec interactionÀ mon humble avis, JMP a vraiment vraiment _TRÈS_ besoin de mettre à jour cette fonctionnalité.J'ai rencontré ce problème plusieurs fois et il n'y a tout simplement pas de solution de contournement valable.JMP ne doit réexécuter le script graphique que lorsque quelque chose change (comme la taille du graphique), pas simplement lors du défilement/modification de la taille de la fenêtre.
Cela étant dit, j'ai trouvé que la méthode la plus rapide pour faire quelque chose comme ça est comme indiqué ci-dessous.Je crée un chemin SVG (d'après mon expérience, c'est de loin le moyen le plus rapide de rendre des chemins complexes dans JMP) et j'ai une sentinelle pour déterminer s'il faut ou non reconstruire le chemin.J'ai inclus un bouton pour forcer la reconstruction du chemin simplement à titre d'exemple.
J'espère que cela aide, mais ce serait encore mieux que les développeurs JMP fournissent un système qui se comporte comme tous les autres systèmes de gestion d'affichage (y compris multi-thread, signal/slots, rappels, etc.).
J'ai également essayé d'utiliser cette méthode pour saisir une image du rendu souhaité, vérifier la taille de la zone graphique et, si la taille n'a pas changé, utiliser l'image enregistrée comme élément à afficher.C'est ce que JMP devrait faire et n'aurait jamais dû être configuré pour exécuter de manière agressive le script graphique à chaque occasion possible.Cependant, je n'ai pas eu beaucoup de chance avec cette méthode car JMP ne fournit pas les outils nécessaires pour que cela fonctionne correctement
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 : Désactiver les mises à jour des graphiques avec interactionJe pense que le problème est que la boîte de cadre se mettra automatiquement à jour chaque fois qu'il y aura un changement, il est donc préférable d'effectuer toutes les modifications avant le rendu. De plus, vous pouvez également vectoriser les opérations pour la vitesse, au lieu d'itérer explicitement avec la fonction For(). Les segments graphiques offrent également certains avantages, mais ils sont actuellement mal documentés.
Voir cette approche :
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
(Je n'ai pas votre tableau de données donc je n'ai pas pu le tester, mais il devrait quand même illustrer la démarche.)