/*""" JSL dans Graph Builder Auteur : jthi Date de création : 2024-09-18 Création Version JMP : JMP Pro 18.0.1 Ceci n'est qu'un petit aperçu de ce qui peut être scripté dans le générateur de graphiques. Cela chevauchera également partiellement les graphiques de script en général """*/ Noms Par défaut Ici(1); dt = Open("$SAMPLE_DATA/Big Class.jmp"); stop(); // pour empêcher le script de s'exécuter jusqu'à la fin tout en ajoutant ici la portée /*""" Amélioration du script créé par JMP """*/ // JMP a créé un script de création de graphique simple // Instantané du rapport : 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))) ); // Supprimez les commentaires inutiles, ajoutez une référence à votre table et stockez la référence dans une variable // L'abréviation courante est gb pour Graph Builder 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))) ); /*""" Remplacer dynamiquement une seule colonne """*/ // REMARQUE : je stocke toujours mes "références" de colonne sous forme de chaînes des noms de colonne // C'est l'option la plus flexible (et la plus robuste) à mon avis, mais vous devrez savoir // comment les modifier dans d'autres formats si nécessaire group_col = "age"; gb = dt << Graph Builder( Afficher le panneau de configuration(0), Variables(X(:poids), Y(:hauteur), Page(groupe_col)), Éléments(Points(X, Y, Légende(3)), Lisseur(X, Y, Légende(4))) ); // Eval() est suffisant gb = dt << Graph Builder( Afficher le panneau de configuration(0), Variables(X(:poids), Y(:hauteur), Page(Eval(groupe_col))), Éléments(Points(X, Y, Légende(3)), Lisseur(X, Y, Légende(4))) ); // Vous pouvez emprunter une voie plus compliquée ET parfois cela est utile (créer des expressions) // Habituellement, ma méthode préférée 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))) ) ); //mais vous pouvez utiliser 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)) ); // Exécution (vous pouvez ajouter Eval avant EvalExpr() si vous souhaitez simplement créer le graphique gb = Eval(gb_expr1); // Remarque : vous avez déjà évalué l'expression -> groupcol ne sera pas mis à jour group_col = "sex"; gb = Eval(gb_expr1); // De nombreuses options permettent de gérer cela, créer une fonction, utiliser une expression, ... 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); /*""" Remarque : Graph Builder est une plate-forme compliquée """*/ 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 ); // Vous ne pourrez peut-être pas accéder à tout directement à partir du rapport Graph Builder // et vous devrez peut-être utiliser la table de données (par exemple, les groupes) // Si vous accédez aux valeurs à partir de la table, n'oubliez pas que l'ordre peut être différent 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; // Vous pouvez essayer d'analyser les groupes à partir de 121314151617age // Mémoriser les types de données et l'ordre Column(dt, "age") << Set Property( "Value Order", {Custom Order({17, 16, 15, 14, 13, 12}), Common Order(0)} ); Summarize(dt, groups1 = By(:age)); /// ordre considéré (au moins dans ce cas) groups2 = Associative Array(Column(dt, "age")) << get keys; // non pris en compte dt_summary = dt << Summary( Group(:age), Freq("None"), Weight("None"), Lien vers les données d'origine table(0), nom de la table de sortie("Groups"), Privé ); groups3 = dt_summary[0, 1]; Close(dt_summary, pas de sauvegarde); show(groups1, groups2, groups3); /*""" Recherche d'un objet de création de graphique à partir de la fenêtre """*/ // Le texte de la zone de contour du générateur de graphiques n'est pas fiable car il peut être modifié // -> Utiliser l'attribut XML helpKey // Références aux zones de contour dans le rapport actuel (peuvent être multiples) obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Obtenir un objet scriptable ; // références aux générateurs de graphiques // Exemple complet de recherche d'un générateur de graphiques unique à partir du rapport actuel obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Obtenir un objet scriptable ; // références aux générateurs de graphiques If(N Items(obs) < 1, Throw("Aucun générateur de graphiques trouvé"); ); gb = obs[1] << obtenir un objet scriptable ; gb << Obtenir la table de données ; // ... et ainsi de suite /*""" Modification de différentes parties du générateur de graphiques """*/ // Modifier certaines choses est très simple 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("MON NOUVEAU TITRE"); // Modifie la zone de contour // Que diriez-vous du texte sous la zone de contour ("titre du graphique") gb << Subtitle("Test"); // non gb << Show Subtitle(1); // XPath tebs = Report(gb) << XPath("//GraphBuilderTitleBox/TextEditBox"); tebs[1] << Set Text("Before subtitle"); // Ou indice de rapport (je préfère XPath) Report(gb)[GraphBuilderTitleBox(1), TextEditBox(1)] << Set Text("Before Subtitle2"); // Peut aussi être modifié avec Dispatch mais personnellement je n'aime pas les utiliser // La syntaxe est difficile à comprendre à mon avis (qu'est-ce que "graph title" par exemple) 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 peut faire la même chose (ou pas) Je préfère utiliser AxisBox rep = Report(gb); // Titres des axes // Dispatch est l'option la plus simple Report(gb) << Dispatch({}, "Y title", TextEditBox, {Set Text("My Y Axis")}); Report(gb) << Dispatch({}, "X title", TextEditBox, {Set Text("My X Axis")}); // Remarque : si vous avez un regroupement et ainsi de suite, vous pourrez potentiellement avoir plusieurs frameboxes // et axisboxes rep[AxisBox(1)] << Select(1); // Premier axe X rep[AxisBox(2)] << Select(1); // Axe Y rep[AxisBox(3)] << Select(1); // Deuxième axe X // Apprendre à naviguer dans ces abs = rep << XPath("//AxisBox"); yaxis = Remove From(abs, 2)[1]; yaxis << select(1); // abs laissé avec juste les références de l'axe des x à l'axe des y << Min(-1) << Max(10); abs << Min(1); // vous pouvez vérifier à partir des paramètres de l'axe comment l'échelle se déroule pour les données catégorielles // Dans le générateur de graphiques, "index" commence à 0 mais ce n'est pas le même pour toutes les plateformes 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 peut faire la même chose (ou pas) Je préfère utiliser AxisBox rep = Report(gb); fbs = rep << XPath("//FrameBox"); firstfb = fbs[1]; // Si vous souhaitez avoir des scripts graphiques, vous les définissez sur des frameboxes firstfb << Add Graphics Script( H Line(3); ); // N'oubliez pas que si vous utilisez des variables, vous souhaiterez peut-être les évaluer d'une manière ou d'une autre 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] << Add Graphics Script( For(i = 1, i <= N Items(vals), i++, H Line(vals[i]) ); ); gb << reshow; vals2 = 1::7; fbs[3] << Ajouter un script graphique( For Each({val}, vals2, H Line(val) ); ); vals2 = .; gb << reshow; vals3 = 1::7; Eval(EvalExpr( fbs[4] << Ajouter un script graphique( myvals = Expr(vals3); For Each({val}, myvals, H Line(val); ); ); )); gb << reshow; // Les segments peuvent contenir des informations intéressantes // Ou vous pouvez manipuler des graphiques à travers eux 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)] << Rechercher des segments(); segs << nom de la classe; 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; // dommage que cela ne fonctionne pas dans le générateur de graphiques // Testez ce qui se passe si vous n'utilisez pas le rang en utilisant l'ordre par défaut ou en supprimant [order] //order = 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])); ); )); // Générateur de graphiques de construction dynamique // Peut fonctionner comme exemple //
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 << 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)}); // Les indices/positions peuvent être très déroutants avec ceux-ci gb << Add Element(1, 1, {Type("Line Of Fit"), X, Y, Degree("Quadratic")}); gb << Remove Element(1, 1, 2); // Exemple, nous souhaitons construire un graphique basé sur les entrées utilisateur // Nous ne savons pas combien d'axes Y l'utilisateur nous fournit // mais nous avons un axe x statique dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp"); // Vérifiez à quoi ressemblerait le script JMP créé avec 1 ou plusieurs colonnes // si vous voulez des axes imbriqués/séparés, testez cela également // Une colonne gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE), Y(:NPN1)), Elements(Points(X, Y, Legend(3))) ); // Plusieurs colonnes dans le même axe gb = dt << Graph Builder( Afficher le panneau de configuration(0), Variables(X(:SITE), Y(:NPN1), Y(:PNP1, Position(1)), Y(:PNP2, Position(1))), Éléments(Points(X, Y(1), Y(2), Y(3), Légende(4))) ); // Axe séparé gb = dt << Graph Builder( Afficher le panneau de configuration(0), Variables(X(:SITE), Y(:NPN1), Y(:PNP1), Y(:PNP2)), Éléments(Position(1, 1), Points(X, Y, Légende(19))), Éléments(Position(1, 2), Points(X, Y, Légende(20))), Éléments(Position(1, 3), Points(X, Y, Légende(21))) ); // Maintenant, vous devez comprendre comment construire ceci // Il existe au moins deux approches // Construire l'expression Ou utiliser << ajouter une variable + << Ajouter un élément // Utilisation de l'ajout de variable/élément // Avec ceux-ci, vous pouvez parfois compter sur JMP pour ajouter "la plupart" du script // Axe Y séparé // Créer un graphique initial 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 << Ajouter une variable({Expr(NameExpr(AsColumn(dt, ycol))), Role("Y")}); )); ); gb << reshow; gb << Afficher la fenêtre(1); // afficher lorsque vous êtes prêt wait(0); // Même axe Y 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)}); )); ); // Création d'une expression 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) )); // Cela fonctionne car les points sont la valeur par défaut dans le générateur de graphiques // mais vous souhaitez généralement le construire davantage. Exemple avec un axe identique différent /* 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)); Pour Each({ycol, idx}, ycols, cur_expr = Eval Expr(Y(Expr(Nom Expr(AsColumn(dt, ycol))), Position(1))); Insérer dans(expr_variables, Nom Expr(cur_expr)); cur_expr2 = Eval Expr(Y(Expr(idx))); Insérer dans(expr_lignes, Nom Expr(cur_expr2)); ); Eval(Substitute( Expr(gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), _variables_, Elements(_lines_) )), Expr(_variables_), Nom Expr(expr_variables), Expr(_lines_), Nom Expr(expr_lignes) )); // Un exemple de la communauté Web("
https://community.jmp.com/t5/The-Plot-Thickens/Reply-All-How-to-script-dynamic-content-for-Graph-Builder/ba-p/21092", JMP Window); // Il existe de nombreuses astuces liées à celles-ci, mais nous n'avons pas le temps de commencer à les couvrir dans cette session // La documentation est également très insuffisante pour celles-ci... // Vérifiez la fonction GraphBuilderBox / Graph Builder à partir de l'index de script pour certaines possibilités Open Help( "Scripting Index", Search(Term("Graph Builder"), Match({"Contains Terms", "Match All Terms", "Ignore Case"})), IndexContext( Category("All Categories"), Object("Search results"), Method("Add Element") ) ); // manipulation du générateur de graphes dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Variables(X(:height), Y(:weight)), Elements(Points(X, Y), Smoother(X, Y)) ); // Modification des statistiques récapitulatives gb << Update Element(1, 1, 1, {Summary Statistic("Mean"), Error Bars("Range")}); // Parfois, vous souhaiterez peut-être manipuler directement depuis l'interface utilisateur cbs = Report(gb) << XPath("//ComboBox"); cbs[1] << get items; cbs[1] << Set(2); // Définir les statistiques récapitulatives sur "N" (deuxième option) cbs[1] << Set(Contains(cbs[1] << get items, "Mean")); // L'une des questions les plus posées dans la communauté JMP // Ajout de lignes à vos tracés // Certaines de ces méthodes s'appliquent à plusieurs types de générateur de graphiques, mais pas à tous dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Exemple très simple 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))) ); // différentes "limites" de hauteur pour F et M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Vous n'avez pas toujours besoin de vous fier aux scripts, l'option la plus simple (en fonction de vos données) // est d'utiliser la table de données. Pour les données larges/divisées, vous pourrez peut-être utiliser les limites de spécification // Pour les données hautes, ajoutez une ligne à votre graphique newcol1 = dt << New Column("Low", Numeric, Continuous, Formula( aa_limits[:sex][1]; )); newcol2 = dt << New Column("High", Numeric, Continuous, Formula( aa_limits[:sex][2]; )); dt << exécuter les formules ; newcol1 << Supprimer la formule ; newcol2 << Supprimer la formule ; // Notez comment les variables ont été définies dans Points et Line gb = dt << Graph Builder( Size(570, 762), Variables( X(:age), Y(:height), Y(:Low, Position(1)), Y(:High, Position(1)), Group X(:sex) ), Elements(Points(X, Y(1), Legend(1)), Line(Y(2), Y(3), Legend(4))), SendToReport( Dispatch({"Points"}, "", OutlineBox, {Close(0)}), Dispatch({"Line"}, "", OutlineBox, {Close(0)}) ) ); // L'avantage de cela est qu'il prend en charge facilement plusieurs types de graphiques // et fonctionne facilement avec le filtre de données local // Vous pouvez également utiliser Caption pour créer des lignes, mais cela peut ne pas fonctionner aussi bien avec le groupe X // Scripting - utilisez les lignes de référence 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))) ); // différentes "limites" de hauteur pour F et M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Nous avons plusieurs graphiques (nous avons utilisé Page) 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 - utiliser un script graphique // Avec plusieurs cadres et groupes, cela peut rapidement devenir assez compliqué 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<< Résumé( Groupe(:sexe), N Catégories(:âge), Fréq("Aucun"), Poids("Aucun"), Lien vers la table de données d'origine(0), nom de la table de sortie("groupes"), invisible ); groupes = dt_groups[0, [1 3]]; Fermer(dt_groups, pas de sauvegarde); fbs = gb << XPath("//FrameBox"); total_groups = 0; For Each({fb, idx}, fbs, Eval(EvalExpr( fb << Ajouter un script graphique( limites = Expr(aa_limits[groups[idx][1]]); start_group = 0; total_groups = start_group + Expr(groups[idx][2]); Pen Color("Red"); Line({start_group - 1, boundaries[1]}, {total_groups, boundaries[1]}); Pen Color("Blue"); Line({start_group - 1, boundaries[2]}, {total_groups, boundaries[2]}); ); )); ); // Graphiques et lignes de variabilité pour plus d'exemples Web("
https://community.jmp.com/t5/Discussions/Add-Reference-Lines-to-multiple-Variability-Charts-in-a-Column/td-p/722908", JMP Window); Web("
https://community.jmp.com/t5/Discussions/differentes-limites-de-specifications-sur-un-graphique-de-variabilite/td-p/565177", Fenêtre JMP); Web("
https://community.jmp.com/t5/Discussions/Variantes-limites-de-specifications-par-categorie-de-donnees-dans-un-graphique-de-variabilite/td-p/723027", Fenêtre JMP); /*""" Non couvert en raison de limitations de temps """*/ // Filtre de données local // Peut causer des problèmes lors de la reconstruction des frameboxes, Web("
https://community.jmp.com/t5/Discussions/Comment-definir-une-ligne-de-reference-sur-chaque-page-avec-l-option-Page-dans/mp/798517", "Fenêtre JMP"); // Sélecteur de colonnes // Étiquette de survol Web("
https://www.jmp.com/support/help/en/18.0/index.shtml#page/jmp/work-with-the-hover-label-execution-context.shtml#ww599987"); // Serveur de légendes // Différents gestionnaires d'état // Définition des images sur le graphique Write();