Comment lier les sélections de graphes avec JSL ?Salut tout le monde!
J'utilise Application Builder et j'ai plusieurs tracés différents que j'ai scriptés à l'aide de Graph Builder. De nombreux graphiques utilisent différentes tables de données qui ont été exploitées à l'aide de Python et renvoyées dans JMP. Étant donné que les données subissent un traitement important en Python, ces tables n'incluent aucune des mêmes variables.Je cherche un moyen de connecter des sélections sur ces graphiques (comme si vous sélectionnez l'une des étiquettes de légende et qu'elle grise les éléments non sélectionnés) en utilisant JSL.
Par exemple, je représente graphiquement mes données brutes et mes données de "produit final", qui ont des dimensions considérablement réduites et des caractéristiques similaires sont regroupées, donc dans Table1/Graph1 il peut y avoir 30 colonnes et dans Table2/Graph2 il n'y en a que 3. Si j'ai une zone de liste avec les variables Table2 et que je sélectionne Variable1, j'aimerais pouvoir mettre en évidence Variable1 sur Graph2, mais aussi mettre en évidence les informations pertinentes dans Graph1. Je peux déterminer les colonnes/lignes pertinentes à mettre en évidence, mais je n'ai pas trouvé comment définir ces sélections sur le graphique. Ce serait également formidable si je pouvais sélectionner l'une des étiquettes de légende sur un graphique (où il grise automatiquement les éléments non sélectionnés) et scripter quelque chose afin qu'il sélectionne les informations pertinentes sur les autres graphiques.
Existe-t-il une ligne JSL pour mettre en évidence quelque chose sur un graphique comme celui-ci ?
Personnalisation de masseRe : Comment lier les sélections de graphiques avec JSL ?Les gestionnaires d'état de ligne se déclenchent sur tous les changements d'état de ligne. Ainsi, lorsque vous choisissez 1 ligne, vous déclenchez (au moins) deux événements ; une désélection et une sélection. Cela cause très probablement des problèmes et pourrait très facilement provoquer une boucle. Si vous ne pouviez capturer que des événements spécifiques (sélectionner, désélectionner, masquer, exclure...), cela fonctionnerait peut-être.
Re : Comment lier les sélections de graphiques avec JSL ?Je vois... Merci pour l'info! Puisque je ferme ce chapitre sur les gestionnaires d'état de ligne lol, j'ai décidé d'essayer à nouveau l'idée "<< Ajouter un script graphique" fournie ci-dessus, mais avec des drapeaux cette fois. Lorsqu'il est implémenté sans drapeaux, il semble présenter le même (mauvais) comportement auquel je faisais face ci-dessus, mais avec flags ça a l'air de fonctionner !
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
J'espère que cela continuera à fonctionner pendant que j'étends les connexions graphiques. Une idée de la raison pour laquelle les gestionnaires d'état de ligne saisiront continuellement la "sélection" encore et encore (créant ainsi une boucle entre les graphiques et gelant JMP) et pourquoi le même JSL dans un script graphique ne le fait pas?
J'apprécie vraiment l'aide @jthi & @txnelson !
Re : Comment lier les sélections de graphiques avec JSL ?Géré, à un moment donné, pour générer un message "utile" dans le journal amélioré

Re : Comment lier les sélections de graphiques avec JSL ?Il se passe des choses pas si amusantes avec les Row State Handlers (j'essaie toujours de les éviter, car ils ne fonctionnent pas assez mal à mon avis). Essayez d'exécuter l'exemple que j'ai fourni en cliquant sur des lignes uniques dans Big Class et consultez JMP Log.
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
Re : Comment lier les sélections de graphiques avec JSL ?C'est ce que j'ai essayé mais je ne pense pas que je comprends assez bien les états/le gestionnaire d'état de ligne/les drapeaux. J'ai joint une vidéo de ce que j'ai décrit ci-dessus. Le graphique affiché est lié à f2 et dt2 :
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);Au début, je pensais que le glissement posait un problème car la sélection changeait à chaque nouveau point ajouté jusqu'à ce que le glissement soit terminé, mais d'après la sortie "group_selected" dans le journal, il ne semble même pas que la sélection change . Il me semble que la boucle est due à l'ajout d'une nouvelle sélection dans le gestionnaire d'état de ligne, mais je ne sais pas comment éviter cela pour atteindre mon objectif des deux graphiques (et éventuellement plus) pointant l'un vers l'autre.
Toutes les suggestions sont les bienvenues.
Re : Comment lier les sélections de graphiques avec JSL ?J'utiliserais les instructions Show() pour afficher l'état de l'indicateur dans le journal, puis je ferais glisser votre doigt pour voir si vous pouvez déterminer où se situe le problème de synchronisation.
Re : Comment lier les sélections de graphiques avec JSL ?Merci beaucoup pour la réponse, @txnelson ! Utiliser des drapeaux est une bonne idée. Malheureusement, je rencontre toujours des problèmes de récursivité... J'ai joué avec différents emplacements de la variable flag et avec ma compréhension limitée du JSL avec lequel je joue, cette syntaxe actuelle me semble la plus logique (presque exactement comment votre pseudo-code est structuré).Voici le mien:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />Ce qui précède fonctionne si je fais des sélections en cliquant sur les étiquettes de légende (yay !) et si je fais des sélections singulières en cliquant sur des marqueurs individuels sur le tracé (yay !), mais entre dans une boucle si j'essaie de faire des sélections en faisant glisser un volet de sélection sur l'intrigue réelle (ce qui est le scénario le plus probable de mon utilisateur).Mes variables d'indicateur sont-elles censées être différentes pour chaque fonction distincte ? La seule façon dont je peux actuellement le faire fonctionner comme je l'ai décrit est d'utiliser la même variable d'indicateur ... Y a-t-il simplement quelque chose que je néglige ?
Il semble également changer d'une manière ou d'une autre ma variable d'indicateur "already_run" si je passe même ma souris sur le graphique sans cliquer sur quoi que ce soit. Est-ce dû au fonctionnement du gestionnaire d'état de ligne ?
J'apprécie ton aide!
Re : Comment lier les sélections de graphiques avec JSL ?Tous les graphiques qui ont été générés à partir de la même table de données verront automatiquement leurs points, lignes, etc. sélectionnés, lorsque l'un des graphiques a des points, des lignes, etc. sélectionnés.
Si les graphiques proviennent de 2 tables différentes, un gestionnaire d'état de ligne peut être construit pour chacune des tables de données.Vous avez raison dans votre déclaration sur un argument circulaire, cependant, la façon dont j'ai géré cela est de définir un indicateur dans chacun des gestionnaires qui empêche la poursuite du cycle.
Voici un simple morceau de pseudo-code qui devrait vous donner une idée sur la façon de le configurer
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );Re : Comment lier les sélections de graphiques avec JSL ?Existe-t-il un moyen d'utiliser les gestionnaires d'état de ligne de manière à ce qu'une sélection sur Graph1 mette en évidence les informations pertinentes sur Graph2 et vice versa? Je peux faire en sorte que ce soit dans un sens ou dans l'autre, mais il semble que si je veux faire les deux, cela devient un argument circulaire qui gèle JMP....Existe-t-il un moyen intelligent de pointer les deux graphiques/tables de données vers l'autre qui n'entraîne pas d'arguments circulaires ?
Re : Comment lier les sélections de graphiques avec JSL ?Lorsque des points ou des lignes sont sélectionnés dans un générateur de graphiques, un graphique bivarié, etc., les lignes associées à la sélection sont sélectionnées dans la table de données associée.Ceci indépendamment du fait que la table soit visible ou non.Par conséquent, il est assez simple d'implémenter un gestionnaire d'état de ligne, qui s'exécute chaque fois qu'un changement dans la sélection de lignes est détecté.
Re : Comment lier les sélections de graphiques avec JSL ?Merci pour la réponse, @jthi ! Je ne suis pas sûr que ces solutions soient applicables dans mon cas, sauf s'il existe un moyen de déterminer les lignes/colonnes/index/etc sélectionnés simplement à partir d'une sélection effectuée sur le graphique. Aucune des tables de données utilisées dans mon application n'est visible pour que l'utilisateur puisse effectuer des sélections dans... L'idée est juste de s'interfacer avec les visualisations et le code fait toutes les manipulations sur les tables dans les coulisses.
J'ai l'impression qu'il doit y avoir une itération de "<< Get Selected" pour les sélections de graphiques, mais je n'ai pas trouvé la bonne implémentation dans l'index de script. S'il existe une ligne JSL pour cela, alors je pense que l'idée "<< Ajouter un script graphique" que vous avez mentionnée pourrait très bien fonctionner une fois les sélections effectuées!
Re : Comment lier les sélections de graphiques avec JSL ?Je n'ai jamais utilisé Application Builder, mais vous pouvez éventuellement utiliser des gestionnaires d'état de ligne.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
Une autre option pourrait être d'utiliser Graph Script :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
Une autre option consisterait à utiliser des jointures virtuelles, mais celles-ci nécessiteraient que vous ayez des tables de données enregistrées quelque part.