Wie verknüpfe ich Diagrammauswahlen mit JSL?Hallo allerseits!
Ich verwende Application Builder und habe mehrere verschiedene Diagramme, die ich mit Graph Builder als Skript erstellt habe. Viele der Diagramme verwenden unterschiedliche Datentabellen, die mit Python bearbeitet und an JMP zurückgesendet wurden. Da die Daten eine umfangreiche Verarbeitung in Python durchlaufen, enthalten diese Tabellen keine derselben Variablen.Ich suche nach einer Möglichkeit, Auswahlen in diesen Diagrammen mithilfe von JSL zu verbinden (z. B. wenn Sie eine der Legendenbeschriftungen auswählen und die nicht ausgewählten Elemente ausgegraut werden).
Ich stelle zum Beispiel meine Rohdaten grafisch dar und meine „Endprodukt“-Daten, die stark reduzierte Abmessungen und ähnliche Merkmale haben, sind gruppiert, sodass es in Tabelle1/Grafik1 möglicherweise 30 Spalten und in Tabelle2/Grafik2 nur 3 gibt. Wenn ich ein Listenfeld mit den Tabellen2-Variablen habe und Variable1 auswähle, möchte ich Variable1 in Diagramm2 hervorheben können, aber auch die relevanten Informationen in Diagramm1 hervorheben. Ich kann die relevanten Spalten/Zeilen bestimmen, die hervorgehoben werden sollen, aber ich konnte nicht herausfinden, wie ich diese Auswahl tatsächlich im Diagramm festlegen kann. Es wäre auch großartig, wenn ich eine der Legendenbeschriftungen in einem Diagramm auswählen könnte (wo die nicht ausgewählten Elemente automatisch ausgegraut werden) und etwas schreiben könnte, damit die relevanten Informationen in den anderen Diagrammen ausgewählt werden.
Gibt es eine JSL-Zeile, um etwas in einem solchen Diagramm hervorzuheben?
MassenanpassungBetreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Zeilenstatus-Handler werden bei allen Änderungen des Zeilenstatus ausgelöst. Wenn Sie also eine Zeile auswählen, lösen Sie (mindestens) zwei Ereignisse aus; einmal abwählen und einmal auswählen. Höchstwahrscheinlich verursacht dies einige Probleme und könnte sehr leicht eine Schleife verursachen. Wenn Sie nur bestimmte Ereignisse erfassen könnten (auswählen, die Auswahl aufheben, ausblenden, ausschließen ...), würde es vielleicht funktionieren.
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Ich verstehe... Danke für die Info! Da ich dieses Kapitel über Zeilenstatus-Handler schließe, lol, habe ich beschlossen, die oben bereitgestellte Idee „<< Grafikskript hinzufügen“ noch einmal auszuprobieren, diesmal jedoch mit Flags. Wenn es ohne Flags implementiert wird, scheint es das gleiche (schlechte) Verhalten zu zeigen, mit dem ich oben zu tun hatte, aber mit flags es scheint zu funktionieren!
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"));
))));
Hoffentlich funktioniert das weiterhin, wenn ich die Grafikanschlüsse erweitere. Irgendeine Idee, warum Zeilenstatushandler die „Auswahl“ immer wieder erfassen (wodurch eine Schleife zwischen den Diagrammen entsteht und JMP einfriert) und warum dieselbe JSL in einem Grafikskript dies nicht tut?
Ich schätze die Hilfe wirklich @jthi & @txnelson !
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Irgendwann ist es gelungen, eine „hilfreiche“ Meldung im erweiterten Protokoll zu generieren

Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Es gibt einige Dinge, die mit Row State Handlern nicht so lustig sind (ich versuche immer, sie zu vermeiden, da sie meiner Meinung nach nicht so schlecht funktionieren). Versuchen Sie, das von mir bereitgestellte Beispiel auszuführen, indem Sie in der großen Klasse auf einzelne Zeilen klicken und JMP-Protokoll anzeigen.
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();
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Das habe ich versucht, aber ich glaube nicht, dass ich Zustände/Zeilenzustandshandler/Flags gut genug verstehe. Ich habe ein Video von dem angehängt, was ich oben beschrieben habe. Die gezeigte Grafik bezieht sich auf f2 und 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);Zuerst dachte ich, dass das Ziehen ein Problem verursacht, weil sich die Auswahl mit jedem neuen hinzugefügten Punkt ändert, bis das Ziehen abgeschlossen ist, aber basierend auf der „group_selected“-Ausgabe im Protokoll sieht es nicht einmal so aus, als würde sich die Auswahl ändern . Es scheint mir, dass die Schleife auf das Hinzufügen einer neuen Auswahl innerhalb des Zeilenstatus-Handlers zurückzuführen ist, aber ich bin mir nicht sicher, wie ich dies vermeiden kann, um mein Ziel zu erreichen, dass beide Diagramme (und möglicherweise auch mehrere) aufeinander zeigen.
Alle Vorschläge sind willkommen.
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Ich würde Show()-Anweisungen verwenden, um den Flag-Status im Protokoll anzuzeigen, und dann ziehen, um festzustellen, wo das Zeitproblem liegt.
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Vielen Dank für die Antwort, @txnelson ! Die Verwendung von Flags ist eine gute Idee. Leider stoße ich immer noch auf einige Rekursionsprobleme ... Ich habe mit verschiedenen Speicherorten der Flag-Variablen herumgespielt und mit meinem begrenzten Verständnis der JSL, mit der ich herumspiele, ist diese aktuelle Syntax für mich am sinnvollsten (fast genau so, wie Ihr Pseudocode strukturiert ist).Hier ist mein:
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 />Das Obige funktioniert, wenn ich eine Auswahl durch Klicken auf die Beschriftungen der Legende treffe (juhu!) und wenn ich eine Einzelauswahl durch Klicken auf einzelne Markierungen im Diagramm treffe (juhu!), aber es kommt zu einer Schleife, wenn ich versuche, eine Auswahl durch Ziehen eines Auswahlbereichs zu treffen auf der tatsächlichen Handlung (was das wahrscheinlichste Szenario meines Benutzers ist).Sollen meine Flag-Variablen für jede einzelne Funktion unterschiedlich sein? Derzeit kann ich es nur so zum Laufen bringen, wie ich es beschrieben habe, indem ich dieselbe Flag-Variable verwende ... Gibt es einfach etwas, das ich übersehe?
Es scheint auch irgendwie meine Flag-Variable „already_run“ zu ändern, wenn ich mit der Maus über das Diagramm fahre, ohne auf etwas zu klicken. Liegt das an der Funktionsweise des Row State Handlers?
Ich schätze Ihre Hilfe!
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Bei allen Diagrammen, die aus derselben Datentabelle erstellt wurden, werden automatisch Punkte, Linien usw. ausgewählt, wenn in einem der Diagramme Punkte, Linien usw. ausgewählt sind.
Wenn die Diagramme aus zwei verschiedenen Tabellen stammen, kann für jede Datentabelle ein Zeilenstatushandler erstellt werden.Sie haben Recht mit Ihrer Aussage zu einem Zirkelargument. Ich habe dies jedoch so gehandhabt, dass ich in jedem der Handler ein Flag gesetzt habe, das die Fortsetzung des Zyklus verhindert.
Hier ist ein einfacher Pseudocode, der Ihnen eine Vorstellung davon geben soll, wie Sie ihn einrichten
// 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 );Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Gibt es eine Möglichkeit, Row State Handler so zu verwenden, dass eine Auswahl in Graph1 relevante Informationen in Graph2 hervorhebt? Und und umgekehrt? Ich kann es auf die eine oder andere Weise erreichen, aber wenn ich beides tun möchte, wird es zu einem Zirkelschluss, der JMP einfriert ...Gibt es eine intelligente Möglichkeit, beide Diagramme/Datentabellen aufeinander zu verweisen, ohne dass es zu Zirkelargumenten kommt?
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Wenn Punkte oder Linien in einem Graph Builder-, Bivariate- usw. Diagramm ausgewählt werden, werden die mit der Auswahl verknüpften Zeilen in der zugehörigen Datentabelle ausgewählt.Dies gilt unabhängig davon, ob die Tabelle sichtbar ist oder nicht.Daher ist es recht einfach, einen Row State Handler zu implementieren, der immer dann ausgeführt wird, wenn eine Änderung in der Auswahl der Zeilen erkannt wird.
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Danke für die Antwort, @jthi ! Ich bin mir nicht sicher, ob diese Lösungen in meinem Fall anwendbar sind, es sei denn, es gibt eine Möglichkeit, die ausgewählten Zeilen/Spalten/Indizes/usw. einfach anhand einer im Diagramm getroffenen Auswahl zu bestimmen. Keine der in meiner App verwendeten Datentabellen ist für den Benutzer sichtbar, in dem er eine Auswahl treffen kann ... Die Idee besteht lediglich darin, eine Schnittstelle zu den Visualisierungen herzustellen, und der Code übernimmt alle Manipulationen an den Tabellen hinter den Kulissen.
Ich habe das Gefühl, dass es für die Diagrammauswahl eine Iteration von „<< Get Selected“ geben muss, aber ich habe nicht die richtige Implementierung im Skriptindex gefunden. Wenn es dafür eine JSL-Zeile gibt, dann denke ich, dass die von Ihnen erwähnte Idee „<< Grafikskript hinzufügen“ ziemlich gut funktionieren könnte, sobald die Auswahl getroffen wurde!
Betreff: Wie verknüpfe ich Diagrammauswahlen mit JSL?Ich habe Application Builder noch nie verwendet, aber Sie könnten möglicherweise Row State Handler verwenden.
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 = .);
Eine andere Option könnte die Verwendung von Graph Script sein:
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));
)));
Eine weitere Option wäre die Verwendung virtueller Verknüpfungen, aber dafür müssten Sie Datentabellen irgendwo speichern.