/*""" JSL in Graph Builder Autore: jthi Data di creazione: 2024-09-18 Versione JMP di creazione: JMP Pro 18.0.1 Questo è solo un piccolo assaggio di ciò che può essere scritto in Graph Builder. Si sovrapporrà anche parzialmente allo scripting dei grafici in generale """*/ Nomi Predefiniti Qui(1); dt = Open("$SAMPLE_DATA/Big Class.jmp"); stop(); // per impedire l'esecuzione dello script fino alla fine, aggiungendo comunque l'ambito qui /*""" Miglioramento dello script creato da JMP """*/ // JMP ha creato uno script semplice per Graph Builder // Istantanea del report: Big Class - Tabella dati di Graph Builder("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))) ); // Rimuovi commenti non necessari, aggiungi un riferimento alla tua tabella e memorizza il riferimento a una variabile // L'abbreviazione comune è gb per 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))) ); /*""" Sostituisci dinamicamente una singola colonna """*/ // NOTA: memorizzo sempre i "riferimenti" delle mie colonne come stringhe dei nomi delle colonne // Questa è l'opzione più flessibile (e robusta) secondo me, ma dovrai sapere // come modificarli in altri formati, se necessario 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() è sufficiente 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))) ); // Puoi seguire una strada più complicata E a volte questo è utile (creare espressioni) // Di solito il mio metodo preferito 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))) ) ); //ma potresti usare 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)) ); // In esecuzione (puoi aggiungere Eval prima di EvalExpr() se vuoi solo creare il grafico gb = Eval(gb_expr1); // Nota: hai già valutato l'espressione -> groupcol non verrà aggiornato group_col = "sex"; gb = Eval(gb_expr1); // Molte opzioni su come puoi gestire questo, creare una funzione, usare un'espressione, ... 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); /*""" Nota: Graph Builder è una piattaforma complicata """*/ 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 ); // Potresti non essere in grado di accedere a tutto direttamente dal report di Graph Builder // e potresti dover utilizzare la tabella dati (ad esempio gruppi) // Se accedi ai valori dalla tabella, ricorda che l'ordine potrebbe essere diverso 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; // Puoi provare ad analizzare i gruppi da 121314151617age // Ricorda i tipi di dati e l'ordinamento Column(dt, "age") << Set Property( "Value Order", {Custom Order({17, 16, 15, 14, 13, 12}), Common Order(0)} ); Summarize(dt, groups1 = By(:age)); /// ordine considerato (almeno in questo caso) groups2 = Associative Array(Column(dt, "age")) << get keys; // non considerato dt_summary = dt << Summary( Group(:age), Freq("None"), Weight("None"), Link ai dati originali table(0), output table name("Groups"), Private ); groups3 = dt_summary[0, 1]; Close(dt_summary, no save); show(groups1, groups2, groups3); /*""" Ricerca dell'oggetto del generatore di grafici dalla finestra """*/ // Non è possibile fare affidamento sul testo della casella di contorno del generatore di grafici poiché può essere modificato // -> Utilizza l'attributo xml helpKey // Riferimenti alle caselle di contorno nel report corrente (potrebbero essere multipli) obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Ottieni oggetto scriptabile; // riferimenti ai generatori di grafici // Esempio completo di ricerca di un singolo generatore di grafici dal report corrente obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Ottieni oggetto scriptabile; // riferimenti ai generatori di grafici If(N Items(obs) < 1, Throw("Nessun generatore di grafici trovato"); ); gb = obs[1] << ottieni oggetto scriptabile; gb << Ottieni tabella dati; // ... e così via /*""" Modificare diverse parti del generatore di grafici """*/ // Modificare alcune cose è molto semplice 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("IL MIO NUOVO TITOLO"); // Modifica la casella di contorno // Che ne dici del testo sotto la casella di contorno ("titolo del grafico") gb << Subtitle("Test"); // no gb << Show Subtitle(1); // XPath tebs = Report(gb) << XPath("//GraphBuilderTitleBox/TextEditBox"); tebs[1] << Set Text("Prima del sottotitolo"); // Oppure segnala l'indicizzazione (preferisco XPath) Report(gb)[GraphBuilderTitleBox(1), TextEditBox(1)] << Set Text("Before Subtitle2"); // Può essere modificato anche con Dispatch, ma personalmente non mi piace usare questi // La sintassi è difficile da capire secondo me (ad esempio, cos'è "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 potrebbe fare la stessa cosa (o no). Io preferisco usare AxisBox rep = Report(gb); // Titoli degli assi // Dispatch è l'opzione più semplice Report(gb) << Dispatch({}, "Y title", TextEditBox, {Set Text("My Y Axis")}); Report(gb) << Dispatch({}, "X title", TextEditBox, {Set Text("My X Axis")}); // Nota: se hai raggruppamenti e così via, potresti avere potenzialmente più framebox // e axisbox rep[AxisBox(1)] << Select(1); // Primo asse X rep[AxisBox(2)] << Select(1); // Asse Y rep[AxisBox(3)] << Select(1); // Secondo asse X // Impara a navigare in questi abs = rep << XPath("//AxisBox"); yaxis = Remove From(abs, 2)[1]; yaxis << select(1); // abs lasciati con solo riferimenti all'asse x yaxis << Min(-1) << Max(10); abs << Min(1); // puoi controllare dalle impostazioni degli assi come va la scala per i dati categoriali // Nel generatore di grafici "index" inizia da 0 ma non è lo stesso per tutte le piattaforme abs << Min(-0.5) << Max(1.5); // FrameBox 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 potrebbe fare la stessa cosa (o no) Preferisco usare AxisBox rep = Report(gb); fbs = rep << XPath("//FrameBox"); firstfb = fbs[1]; // Se vuoi avere degli script grafici, impostali su framebox firstfb << Aggiungi script grafico( H Line(3); ); // Ricorda che se usi delle variabili, potresti volerle valutare in un modo o nell'altro ref = 2; firstfb << Aggiungi script grafico( H Line(ref); ); ref = 3; gb << Reshow; refy = 1; Eval(EvalExpr( firstfb << Aggiungi script grafico( V Line(Expr(refy)); ); )); refy = 0; gb << Reshow; vals = 1::7; fbs[2] << Aggiungi script grafico( For(i = 1, i <= N Items(vals), i++, H Line(vals[i]) ); ); gb << reshow; vals2 = 1::7; fbs[3] << Aggiungi script grafico( For Each({val}, vals2, H Line(val) ); ); vals2 = .; gb << reshow; vals3 = 1::7; Eval(EvalExpr( fbs[4] << Aggiungi script grafico( myvals = Expr(vals3); For Each({val}, myvals, H Line(val); ); ); )); gb << reshow; // I segmenti potrebbero contenere informazioni utili // Oppure puoi manipolare i grafici attraverso di essi 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 << nome classe; ms = Report(gb)[FrameBox(1)] << Find Seg(MarkerSeg(1)); xs = ms << Ottieni valori X; ys = ms << Ottieni valori Y; // ms << Ottieni punto(1); // ms << ottieni marcatori; // ms << Ottieni numeri di riga; // peccato che questo non funzioni nel generatore di grafici // Prova cosa succede se non utilizzi la classifica usando l'ordine predefinito o rimuovi [ordine] //ordine = 1::N Elementi(xs); ordine = Rank(xs); Eval(EvalExpr( Report(gb)[FrameBox(1)] << Aggiungi script grafico( Colore penna("Blu"); Linea(Expr(xs[ordine]), Expr(ys[ordine])); ); )); // Creazione dinamica di un generatore di grafici // Potrebbe funzionare come esempio //
https://community.jmp.com/t5/JMP-Add-Ins/Column-Quick-Swapper-easily-change-multiple-Y-and-X-axis-columns/ta-p/724616 gb = dt << Generatore di grafici( Size(525, 454), Mostra pannello di controllo(0), Variabili(X(:peso), Y(:altezza)), Elementi( Punti(X, Y, Legenda(3)), Barra(X, Y, Legenda(5)) ) ); gb << Aggiungi variabile({:età, ruolo("Wrap")}); gb << Rimuovi variabile(1); gb << Rimuovi variabile(1); gb << Rimuovi variabile(1); gb << Aggiungi variabile({:altezza, ruolo("Y")}); gb << Aggiungi variabile({:peso, ruolo("X")}); gb << Aggiungi variabile({:weight, Role("X")}); gb << Aggiungi variabile({:weight, Role("X"), Position(1)}); // Indici/posizioni possono essere molto confusi con questi gb << Aggiungi elemento(1, 1, {Type("Linea di adattamento"), X, Y, Grado("Quadratico")}); gb << Rimuovi elemento(1, 1, 2); // Ad esempio, vogliamo creare un grafico basato sugli input dell'utente // Non sappiamo quanti assi Y ci fornisce l'utente // ma abbiamo un asse x statico dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp"); // Controlla come apparirebbe lo script creato da JMP con 1 e più colonne // Se desideri un asse nidificato/separato, verifica anche questo // Una colonna gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE), Y(:NPN1)), Elements(Points(X, Y, Legend(3))) ); // Più colonne sullo stesso asse 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))) ); // Asse separato gb = dt << Generatore grafico( Mostra pannello di controllo(0), Variabili(X(:SITO), Y(:NPN1), Y(:PNP1), Y(:PNP2)), Elementi(Posizione(1, 1), Punti(X, Y, Legenda(19))), Elementi(Posizione(1, 2), Punti(X, Y, Legenda(20))), Elementi(Posizione(1, 3), Punti(X, Y, Legenda(21))) ); // Ora devi capire come costruire questo // Ci sono almeno due approcci // Costruisci l'espressione Oppure usa << aggiungi variabile + << aggiungi elemento // Usando aggiungi variabile/elemento // Con questi puoi a volte fare affidamento su JMP aggiungendo "la maggior parte" dello script // Asse Y separato // Crea il grafico iniziale 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 << Aggiungi variabile({Expr(NameExpr(AsColumn(dt, ycol))), Role("Y")}); )); ); gb << reshow; gb << Mostra finestra(1); // mostra quando pronto wait(0); // Stesso asse Y gb = dt << Generatore grafico( Dimensioni(528, 448), Mostra pannello di controllo(0), Variabili(X(:SITO)), Elementi(Punti(X, Y, Legenda(3))) ); ycols = {"NPN1", "NPN2", "NPN3"}; Per ogni({ycol, idx}, ycols, Eval(EvalExpr( gb << Aggiungi variabile({Expr(NomeExpr(AsColumn(dt, ycol))), Ruolo("Y"), Posizione(1)}); )); ); // Creazione dell'espressione variables_expr = Expr(Variabili(X(:SITO))); Per ogni({ycol, idx}, ycols, cur_expr = Eval Expr(Y(Expr(Name Expr(AsColumn(dt, ycol))))); Inserisci Into(variabili_expr, Nome Expr(cur_expr)); ); mostra(variabili_expr); Eval(Sostituisci( Expr(gb = dt << Generatore di grafici( Dimensione(528, 448), Mostra pannello di controllo(0), _variabili_ )), Expr(_variabili_), Nome Expr(variabili_expr) )); // Questo funziona poiché i punti sono l'impostazione predefinita nel generatore di grafici // ma di solito si desidera svilupparlo ulteriormente. Esempio con assi diversi uguali /* gb = dt << Graph Builder( Mostra pannello di controllo(0), Variabili(X(:SITO), Y(:NPN1), Y(:NPN2, Posizione(1)), Y(:NPN3, Posizione(1))), Elementi(Linea(X, Y(1), Y(2), Y(3), Legenda(4))) ); */ ycols = {"NPN1", "NPN2", "NPN3", "NPN4", "NPN5"}; variables_expr = Expr(Variabili(X(:SITO))); lines_expr = Expr(Linea(X)); Per ogni({ycol, idx}, ycols, cur_expr = Eval Expr(Y(Expr(Nome Expr(AsColumn(dt, ycol))), Posizione(1))); Inserisci in(variabili_expr, Nome Expr(cur_expr)); cur_expr2 = Eval Expr(Y(Expr(idx))); Inserisci in(linee_expr, Nome Expr(cur_expr2)); ); Eval(Sostituisci( Expr(gb = dt << Generatore di grafici( Dimensione(528, 448), Mostra pannello di controllo(0), _variabili_, Elementi(_linee_) )), Expr(_variabili_), Nome Expr(variabili_expr), Expr(_linee_), Nome Expr(linee_expr) )); // Un esempio dalla community Web("
https://community.jmp.com/t5/The-Plot-Thickens/Reply-All-How-to-script-dynamic-content-for-Graph-Builder/ba-p/21092", JMP Window); // Ci sono molti trucchi correlati a questi, ma non c'è tempo per iniziare a trattarli in questa sessione // Anche la documentazione è molto carente per questi... // Controlla la funzione GraphBuilderBox / Graph Builder dall'indice di scripting per alcune possibilità Apri Help( "Indice di scripting", Search(Term("Graph Builder"), Match({"Contiene termini", "Corrisponde a tutti i termini", "Ignora maiuscole/minuscole"})), IndexContext( Category("Tutte le categorie"), Object("Risultati della ricerca"), Method("Aggiungi elemento") ) ); // manipolazione del generatore di grafici dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Variables(X(:height), Y(:weight)), Elements(Points(X, Y), Smoother(X, Y)) ); // Modifica delle statistiche riepilogative gb << Update Element(1, 1, 1, {Summary Statistic("Mean"), Error Bars("Range")}); // A volte potresti voler manipolare direttamente dall'interfaccia utente cbs = Report(gb) << XPath("//ComboBox"); cbs[1] << get items; cbs[1] << Set(2); // Imposta le statistiche riepilogative su "N" (seconda opzione) cbs[1] << Set(Contains(cbs[1] << get items, "Mean")); // Una delle domande più frequenti nella community JMP // Aggiunta di linee ai grafici // Alcuni di questi metodi si applicano a più di Graph Builder, ma non a tutti dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Esempio molto semplice 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))) ); // diversi "limiti" di altezza per F e M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Non devi sempre affidarti allo scripting, l'opzione più semplice (a seconda dei tuoi dati) // è utilizzare la tabella dati. Per dati Wide/Split potresti essere in grado di utilizzare i limiti di specifica // Per dati alti aggiungi una riga al tuo grafico 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 << esegui formule; newcol1 << Elimina formula; newcol2 << Elimina formula; // Nota come le variabili sono state impostate in Punti e Linea 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)}) ) ); // La cosa grandiosa è che supporta facilmente più tipi di grafici // e funziona facilmente con i filtri dati locali // Puoi anche usare Caption per creare linee, ma potrebbe non funzionare così bene con X-group // Scripting: usa linee di riferimento 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))) ); // diversi "limiti" di altezza per F e M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Abbiamo più grafici (abbiamo usato 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 << Aggiungi linea di riferimento(vals[1], "Tratteggiato", "Rosso", "basso", 1); yaxis << Aggiungi linea di riferimento(vals[2], "Tratteggiato", "Rosso", "alto", 1); ); // Scripting: usa script grafico // Con più riquadri e gruppi di frame, questo può rapidamente diventare piuttosto complicato 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<< Riepilogo( Gruppo(:sesso), N Categorie(:età), Freq("Nessuno"), Peso("Nessuno"), Collegamento alla tabella dati originale(0), nome tabella di output("gruppi"), invisibile ); gruppi = dt_groups[0, [1 3]]; Chiudi(dt_groups, nessun salvataggio); fbs = gb << XPath("//FrameBox"); total_groups = 0; Per ogni({fb, idx}, fbs, Eval(EvalExpr( fb << Aggiungi script grafico( limits = Expr(aa_limits[groups[idx][1]]); start_group = 0; total_groups = start_group + Expr(groups[idx][2]); Colore penna("Rosso"); Linea({start_group - 1, limiti[1]}, {total_groups, limiti[1]}); Colore penna("Blu"); Linea({start_group - 1, limiti[2]}, {total_groups, limiti[2]}); ); )); ); // Grafici e linee di variabilità per altri esempi 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/different-spec-limits-on-a-variability-chart/td-p/565177", JMP Window); Web("
https://community.jmp.com/t5/Discussions/Varying-spec-limits-by-data-category-in-variability-chart/td-p/723027", JMP Window); /*""" Non coperto a causa di limitazioni di tempo """*/ // Filtro dati locali // Può causare alcuni problemi quando i framebox vengono ricostruiti, Web("
https://community.jmp.com/t5/Discussions/How-to-set-a-Reference-Line-on-each-page-with-Page-option-in/mp/798517", "JMP Window"); // Cambio di colonna // Etichetta al passaggio del mouse Web("
https://www.jmp.com/support/help/it/18.0/index.shtml#page/jmp/work-with-the-hover-label-execution-context.shtml#ww599987"); // Server di legende // Diversi gestori di stato // Impostazione delle immagini sul grafico Write();