/*""" JSL im Graph Builder Autor: jthi Erstellungsdatum: 18.09.2024 Erstellung JMP-Version: JMP Pro 18.0.1 Dies ist nur ein kleiner Vorgeschmack auf das, was im Graph Builder geskriptet werden kann. Dies überschneidet sich teilweise auch mit dem Skripten von Graphen im Allgemeinen """*/ Names Default To Here(1); dt = Open("$SAMPLE_DATA/Big Class.jmp"); stop(); // um zu verhindern, dass das Skript bis zum Ende ausgeführt wird, während hier noch der Gültigkeitsbereich hinzugefügt wird /*""" Verbesserung des von JMP erstellten Skripts """*/ // Von JMP erstelltes einfaches Graph Builder-Skript // Berichtsschnappschuss: Big Class – Graph Builder Data Table("Big Class") << Graph Builder( Size(525, 454), Show Control Panel(0), Variables(X(:weight), Y(:height)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); // Unnötige Kommentare entfernen, Verweis auf Ihre Tabelle hinzufügen und Verweis auf eine Variable speichern // Übliche Abkürzung für Graph Builder ist gb gb = dt << Graph Builder( Size(525, 454), Show Control Panel(0), Variables(X(:weight), Y(:height)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); /*""" Einzelne Spalte dynamisch ersetzen """*/ // ANMERKUNG: Ich speichere meine Spalten-"Referenzen" immer als Zeichenfolgen der Spaltennamen // Meiner Meinung nach ist dies die flexibelste (und robusteste) Option, aber Sie müssen wissen, // wie Sie diese bei Bedarf in andere Formate ändern können group_col = "age"; gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(group_col)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); // Eval() reicht gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(Eval(group_col))), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); // Sie können einen komplizierteren Weg gehen UND manchmal ist dies hilfreich (Ausdrücke erstellen) // Normalerweise meine bevorzugte Methode EvalExpr gb_expr1 = EvalExpr( dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(Expr(NameExpr(AsColumn(dt, group_col))))), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ) ); //aber Sie könnten Substitute gb_expr2 = Substitute( Expr(dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(_groupcol_)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) )), Expr(_groupcol_), NameExpr(AsColumn(dt, group_col)) ); verwenden. // Wird ausgeführt (Sie können Eval vor EvalExpr() hinzufügen, wenn Sie nur das Diagramm erstellen möchten. gb = Eval(gb_expr1); // Hinweis: Sie haben den Ausdruck bereits ausgewertet -> groupcol wird nicht aktualisiert. group_col = "sex"; gb = Eval(gb_expr1); // Viele Optionen, wie Sie damit umgehen können: Funktion erstellen, Ausdruck verwenden, ... gb_expr3 = Expr(EvalExpr( dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(Expr(NameExpr(AsColumn(dt, group_col))))), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ) )); group_col = "age"; gb = Eval(gb_expr3); group_col = "sex"; gb = Eval(gb_expr3); /*""" Hinweis: Graph Builder ist eine komplizierte Plattform """*/ gb = dt << Graph Builder( Size(525, 448), Show Control Panel(0), Variables(X(:sex)), Elements(Bar(X, Legend(3))) ); Report(gb) << show Properties(); Report(gb) << Show Tree Structure; nw = New Window("gbscript", << type("Script"), << Language("XML"), Report(gb) << Get XML ); // Es kann sein, dass Sie nicht auf alles direkt vom Graph Builder-Bericht aus zugreifen können // und Sie müssen eventuell die Datentabelle verwenden (zum Beispiel Gruppen) // Wenn Sie auf die Werte aus der Tabelle zugreifen, denken Sie daran, dass die Reihenfolge anders sein kann gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); // Report(gb)[GraphBuilderGroupBox(1)] << Select(1); Report(gb)[GraphBuilderGroupBox(1)] << get xml; // Sie können versuchen, Gruppen aus 121314151617age zu analysieren // Merken Sie sich Datentypen und Reihenfolge Column(dt, "age") << Set Property( "Value Order", {Custom Order({17, 16, 15, 14, 13, 12}), Common Order(0)} ); Summarize(dt, groups1 = By(:age)); /// Reihenfolge wird berücksichtigt (zumindest in diesem Fall) groups2 = Associative Array(Column(dt, "age")) << get keys; // wird nicht berücksichtigt dt_summary = dt << Summary( Group(:age), Freq("None"), Weight("None"), Link zu Originaldaten table(0), Ausgabetabellenname("Groups"), Privat ); groups3 = dt_summary[0, 1]; Close(dt_summary, no save); show(groups1, groups2, groups3); /*""" Graph Builder-Objekt aus Fenster suchen """*/ // Der Text der Graph Builder-Gliederungsbox ist nicht zuverlässig, da er geändert werden kann // -> XML-Attribut helpKey verwenden // Verweise auf Gliederungsboxen im aktuellen Bericht (können mehrere sein) obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Get Scriptable Object; // Verweise auf Graph Builder // Vollständiges Beispiel für die Suche nach einem einzelnen Graph Builder aus dem aktuellen Bericht obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Get Scriptable Object; // Verweise auf Graph Builder If(N Items(obs) < 1, Throw("Kein Graph Builder gefunden"); ); gb = obs[1] << get scriptable object; gb << Get Data Table; // ... und so weiter /*""" Ändern verschiedener Teile des Graph Builders """*/ // Das Ändern einiger Dinge ist sehr einfach dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); gb << Title("MEIN NEUER TITEL"); // Ändert die Gliederungsbox // Wie wäre es mit dem Text unter der Gliederungsbox ("Graphtitel") gb << Subtitle("Test"); // nö gb << Show Subtitle(1); // XPath tebs = Report(gb) << XPath("//GraphBuilderTitleBox/TextEditBox"); tebs[1] << Set Text("Vor Untertitel"); // Oder Report-Indizierung (ich bevorzuge XPath) Report(gb)[GraphBuilderTitleBox(1), TextEditBox(1)] << Set Text("Before Subtitle2"); // Kann auch mit Dispatch geändert werden, aber ich persönlich verwende diese nicht gern // Die Syntax ist meiner Meinung nach schwer zu verstehen (was ist beispielsweise "graph title") Report(gb) << Dispatch({}, "graph title", TextEditBox, {Set Text("BEFORE SUBTITLE")}); /* nw = New Window("gbscript", << type("Script"), << Language("XML"), Current Report() << Get XML ); */ // AxisBox dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); // ScaleBox macht möglicherweise dasselbe (oder auch nicht). Ich bevorzuge die Verwendung von AxisBox rep = Report(gb); // Achsentitel // Dispatch ist die einfachste Option Report(gb) << Dispatch({}, "Y title", TextEditBox, {Set Text("My Y Axis")}); Report(gb) << Dispatch({}, "X title", TextEditBox, {Set Text("My X Axis")}); // Hinweis: Wenn Sie Gruppierungen usw. haben, können Sie möglicherweise mehrere Frameboxes // und Axisboxes haben rep[AxisBox(1)] << Select(1); // Erste X-Achse rep[AxisBox(2)] << Select(1); // Y-Achse rep[AxisBox(3)] << Select(1); // Zweite X-Achse // Lernen Sie, darin zu navigieren abs = rep << XPath("//AxisBox"); yaxis = Remove From(abs, 2)[1]; yaxis << select(1); // abs bleibt nur mit X-Achsen-Referenzen übrig yaxis << Min(-1) << Max(10); abs << Min(1); // Sie können in den Achseneinstellungen prüfen, wie die Skala für kategorische Daten verläuft // Im Graph Builder beginnt „Index“ bei 0, aber das ist nicht für alle Plattformen gleich abs << Min(-0.5) << Max(1.5); // FrameBoxes dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); // ScaleBox kann dasselbe tun (oder auch nicht). Ich bevorzuge die Verwendung von AxisBox rep = Report(gb); fbs = rep << XPath("//FrameBox"); firstfb = fbs[1]; // Wenn Sie Grafikskripte haben möchten, legen Sie sie in Frameboxen fest firstfb << Add Graphics Script( H Line(3); ); // Bedenken Sie, dass Sie Variablen möglicherweise auf die eine oder andere Weise auswerten möchten ref = 2; firstfb << Add Graphics Script( H Line(ref); ); ref = 3; gb << Reshow; refy = 1; Eval(EvalExpr( firstfb << Add Graphics Script( V Line(Expr(refy)); ); )); refy = 0; gb << Reshow; vals = 1::7; fbs[2] << Grafikskript hinzufügen( For(i = 1, i <= N Items(vals), i++, H Line(vals[i]) ); ); gb << reshow; vals2 = 1::7; fbs[3] << Grafikskript hinzufügen( For Each({val}, vals2, H Line(val) ); ); vals2 = .; gb << reshow; vals3 = 1::7; Eval(EvalExpr( fbs[4] << Grafikskript hinzufügen( myvals = Expr(vals3); For Each({val}, myvals, H Line(val); ); ); )); gb << reshow; // Segmente enthalten möglicherweise interessante Informationen // Oder Sie können Diagramme über sie manipulieren gb = dt << Graph Builder( Size(525, 454), Show Control Panel(0), Variables(X(:weight), Y(:height)), Elements( Points(X, Y, Legend(3)), Bar(X, Y, Legend(5)) ) ); segs = Report(gb)[FrameBox(1)] << Find Segs(); segs << class name; ms = Report(gb)[FrameBox(1)] << Find Seg(MarkerSeg(1)); xs = ms << Get X Values; ys = ms << Get Y Values; // ms << Get Point(1); // ms << get markers; // ms << Get Row Numbers; // schade, dass dies im Graph Builder nicht funktioniert // Testen Sie, was passiert, wenn Sie die Rangfolge nicht verwenden, indem Sie die Standardreihenfolge verwenden oder [Reihenfolge] entfernen //Reihenfolge = 1::N Items(xs); order = Rank(xs); Eval(EvalExpr( Report(gb)[FrameBox(1)] << Add Graphics Script( Pen Color("Blue"); Line(Expr(xs[order]), Expr(ys[order])); ); )); // Graph Builder dynamisch erstellen // Könnte als Beispiel funktionieren //
https://community.jmp.com/t5/JMP-Add-Ins/Column-Quick-Swapper-easily-change-multiple-Y-and-X-axis-columns/ta-p/724616 gb = dt << Graph Builder( Size(525, 454), Show Control Panel(0), Variables(X(:weight), Y(:height)), Elements( Points(X, Y, Legend(3)), Bar(X, Y, Legend(5)) ) ); gb << Add Variable({:age, Role("Wrap")}); gb << Remove Variable(1); gb << Remove Variable(1); gb << Remove Variable(1); gb << Add Variable({:height, Role("Y")}); gb << Add Variable({:weight, Role("X")}); gb << Add Variable({:weight, Role("X")}); gb << Add Variable({:weight, Role("X"), Position(1)}); // Indizes/Positionen können bei diesen sehr verwirrend sein gb << Add Element(1, 1, {Type("Line Of Fit"), X, Y, Degree("Quadratic")}); gb << Remove Element(1, 1, 2); // Beispiel: Wir möchten ein Diagramm basierend auf Benutzereingaben erstellen // Wir wissen nicht, wie viele Y-Achsen uns der Benutzer zur Verfügung stellt // aber wir haben eine statische X-Achse dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp"); // Prüfen Sie, wie das von JMP erstellte Skript mit 1 und mehreren Spalten aussehen würde. // Wenn Sie verschachtelte/separate Achsen wünschen, testen Sie das auch. // Eine Spalte gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE), Y(:NPN1)), Elements(Points(X, Y, Legend(3))) ); // Mehrere Spalten in derselben Achse gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:SITE), Y(:NPN1), Y(:PNP1, Position(1)), Y(:PNP2, Position(1))), Elements(Points(X, Y(1), Y(2), Y(3), Legend(4))) ); // Separate Achse gb = dt << Graph Builder( Systemsteuerung anzeigen(0), Variablen(X(:SITE), Y(:NPN1), Y(:PNP1), Y(:PNP2)), Elemente(Position(1, 1), Punkte(X, Y, Legend(19))), Elemente(Position(1, 2), Punkte(X, Y, Legend(20))), Elemente(Position(1, 3), Punkte(X, Y, Legend(21))) ); // Nun müssen Sie herausfinden, wie Sie dies erstellen // Es gibt mindestens zwei Ansätze // Erstellen Sie den Ausdruck Oder verwenden Sie << Variable hinzufügen + << Element hinzufügen // Verwenden Sie „Variable/Element hinzufügen“ // Dabei können Sie sich manchmal darauf verlassen, dass JMP „den größten Teil“ des Skripts hinzufügt // Separate Y-Achse // Erstellen Sie das erste Diagramm gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE)), Elements(Points(X, Y, Legend(3))), Invisible ); ycols = {"NPN1", "NPN2", "NPN3"}; For Each({ycol, idx}, ycols, Eval(EvalExpr( gb << Add Variable({Expr(NameExpr(AsColumn(dt, ycol))), Role("Y")}); )); ); gb << reshow; gb << Show Window(1); // anzeigen, wenn bereit wait(0); // Dieselbe Y-Achse gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE)), Elements(Points(X, Y, Legend(3))) ); ycols = {"NPN1", "NPN2", "NPN3"}; For Each({ycol, idx}, ycols, Eval(EvalExpr( gb << Add Variable({Expr(NameExpr(AsColumn(dt, ycol))), Role("Y"), Position(1)}); )); ); // Ausdruck erstellen variables_expr = Expr(Variables(X(:SITE))); For Each({ycol, idx}, ycols, cur_expr = Eval Expr(Y(Expr(Name Expr(AsColumn(dt, ycol))))); Insert Into(variables_expr, Name Expr(cur_expr)); ); show(variables_expr); Eval(Substitute( Expr(gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), _variables_ )), Expr(_variables_), Name Expr(variables_expr) )); // Dies funktioniert, da Punkte die Standardeinstellung im Graph Builder sind, // aber normalerweise möchten Sie es weiter ausbauen. Beispiel mit unterschiedlichen gleichen Achsen /* gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:SITE), Y(:NPN1), Y(:NPN2, Position(1)), Y(:NPN3, Position(1))), Elements(Line(X, Y(1), Y(2), Y(3), Legend(4))) ); */ ycols = {"NPN1", "NPN2", "NPN3", "NPN4", "NPN5"}; variables_expr = Expr(Variables(X(:SITE))); lines_expr = Expr(Line(X)); Für jedes ({ycol, idx}, ycols, cur_expr = Eval Expr (Y (Expr (Name Expr (AsColumn (dt, ycol))), Position (1))); Einfügen in (Variablenausdruck, Name Expr (cur_expr)); cur_expr2 = Eval Expr (Y (Expr (idx))); Einfügen in (Zeilenausdruck, Name Expr (cur_expr2)); ); Eval (Ersetzen (Expr (gb = dt << Graph Builder (Größe (528, 448), Systemsteuerung anzeigen (0), _Variablen_, Elemente (_Zeilen_))), Expr (_Variablen_), Name Expr (Variablen_expr), Expr (_Zeilen_), Name Expr (Zeilen_expr))); // Ein Beispiel aus der Community-Website („
https://community.jmp.com/t5/The-Plot-Thickens/Reply-All-How-to-script-dynamic-content-for-Graph-Builder/ba-p/21092“, JMP-Fenster); // Es gibt viele Tricks in diesem Zusammenhang, aber es reicht nicht aus, um in dieser Sitzung alle zu besprechen. // Auch die Dokumentation hierzu ist sehr mangelhaft … // Sehen Sie sich die Funktion GraphBuilderBox/Graph Builder im Skriptindex an, um einige Möglichkeiten zu sehen. Open Help( „Skriptindex“, Search(Term(„Graph Builder“), Match({„Enthält Begriffe“, „Alle Begriffe“, „Groß-/Kleinschreibung ignorieren“})), IndexContext( Category(„Alle Kategorien“), Object(„Suchergebnisse“), Method(„Element hinzufügen“) ) ); // Graph Builder manipulieren dt = Open(„$SAMPLE_DATA/Big Class.jmp“); gb = dt << Graph Builder( Variables(X(:height), Y(:weight)), Elements(Points(X, Y), Smoother(X, Y)) ); // Zusammenfassungsstatistik ändern gb << Update Element(1, 1, 1, {Summary Statistic("Mean"), Error Bars("Range")}); // Manchmal möchten Sie möglicherweise direkt von der Benutzeroberfläche aus manipulieren cbs = Report(gb) << XPath("//ComboBox"); cbs[1] << get items; cbs[1] << Set(2); // Zusammenfassungsstatistik auf "N" setzen (zweite Option) cbs[1] << Set(Contains(cbs[1] << get items, "Mean")); // Eine der am häufigsten gestellten Fragen in der JMP-Community // Linien zu Ihren Diagrammen hinzufügen // Manche dieser Methoden gelten für mehr als nur den Graph Builder, aber nicht für alle dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Sehr einfaches Beispiel gb = dt << Graph Builder( Size(525, 490), Show Control Panel(0), Variables(X(:age), Y(:height), Group X(:sex)), Elements(Points(X, Y, Legend(1))) ); // unterschiedliche Höhen-"Grenzen" für F und M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Sie müssen sich nicht immer auf Skripte verlassen, die einfachste Möglichkeit (abhängig von Ihren Daten) // ist die Verwendung der Datentabelle. Für breite/geteilte Daten können Sie möglicherweise Spezifikationsgrenzen verwenden // Für hohe Daten fügen Sie Ihrem Diagramm eine Linie hinzu newcol1 = dt << New Column("Low", Numeric, Continuous, Formula( aa_limits[:sex][1]; )); newcol2 = dt << Neue Spalte("Hoch", Numerisch, Kontinuierlich, Formel( aa_limits[:Geschlecht][2]; )); dt << Formeln ausführen; newcol1 << Formel löschen; newcol2 << Formel löschen; // Beachten Sie, wie Variablen in Punkten und Linien festgelegt wurden gb = dt << Graph Builder( Größe(570, 762), Variablen( X(:Alter), Y(:Höhe), Y(:Niedrig, Position(1)), Y(:Hoch, Position(1)), Gruppe X(:Geschlecht) ), Elemente(Punkte(X, Y(1), Legende(1)), Linie(Y(2), Y(3), Legende(4))), SendToReport( Dispatch({"Punkte"}, "", OutlineBox, {Schließen(0)}), Dispatch({"Linie"}, "", OutlineBox, {Schließen(0)}) ) ); // Das Tolle daran ist, dass es problemlos mehrere Diagrammtypen unterstützt // und problemlos mit lokalen Datenfiltern funktioniert // Sie können auch Caption verwenden, um Linien zu erstellen, aber das funktioniert möglicherweise nicht so gut mit X-Gruppen // Scripting – verwenden Sie Ref-Zeilen dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(525, 744), Show Control Panel(0), Variables( X(:age), Y(:height), Page(:sex) ), Elements(Points(X, Y(1), Legend(1))) ); // unterschiedliche Höhen-„Grenzen“ für F und M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Wir haben mehrere Diagramme (wir haben Page verwendet) Summarize(dt, groups = By(:sex)); fbs = gb << XPath("//AxisBox"); yaxes = fbs[2::N Items(fbs)::2]; For Each({yaxis, idx}, yaxes, vals = aa_limits[groups[idx]]; yaxis << Add Ref Line(vals[1], "Dashed", "Red", "low", 1); yaxis << Add Ref Line(vals[2], "Dashed", "Red", "high", 1); ); // Scripting - benutze Grafikscript // Bei mehreren Frameboxen und Gruppen kann das schnell kompliziert werden gb = dt << Graph Builder( Size(525, 490), Show Control Panel(0), Variables(X(:age), Y(:height), Group X(:sex)), Elements(Points(X, Y, Legend(1))) ); aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; dt_groups = dt<< Summary( Group(:sex), N Categories(:age), Freq("None"), Weight("None"), Link zur Originaldatentabelle(0), Name der Ausgabetabelle("groups"), unsichtbar ); groups = dt_groups[0, [1 3]]; Close(dt_groups, no save); fbs = gb << XPath("//FrameBox"); total_groups = 0; Für jedes ({fb, idx}, fbs, Eval (EvalExpr (fb << Grafikskript hinzufügen (Grenzen = Expr (aa_limits[Gruppen[idx][1]]); Startgruppe = 0; Gesamtgruppen = Startgruppe + Expr (Gruppen[idx][2]); Stiftfarbe ("Rot"); Linie ({Startgruppe - 1, Grenzen[1]}, {Gesamtgruppen, Grenzen[1]}); Stiftfarbe ("Blau"); Linie ({Startgruppe - 1, Grenzen[2]}, {Gesamtgruppen, Grenzen[2]}); ); )); ); // Variabilitätsdiagramme und -linien für weitere Beispiele Web ("
https://community.jmp.com/t5/Discussions/Add-Reference-Lines-to-multiple-Variability-Charts-in-a-Column/td-p/722908", JMP-Fenster); Web("
https://community.jmp.com/t5/Discussions/different-spec-limits-on-a-variability-chart/td-p/565177", JMP-Fenster); Web("
https://community.jmp.com/t5/Discussions/Varying-spec-limits-by-data-category-in-variability-chart/td-p/723027", JMP-Fenster); /*""" Aufgrund von Zeitbeschränkungen nicht abgedeckt """*/ // Lokaler Datenfilter // Kann einige Probleme verursachen, da Frameboxen neu erstellt werden, Web("
https://community.jmp.com/t5/Discussions/How-to-set-a-Reference-Line-on-each-page-with-Page-option-in/mp/798517", "JMP-Fenster"); // Spaltenumschalter // Hover-Label Web("
https://www.jmp.com/support/help/en/18.0/index.shtml#page/jmp/work-with-the-hover-label-execution-context.shtml#ww599987"); // Legendenserver // Verschiedene Statushandler // Bilder zum Diagramm festlegen Write();