Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Ciao comunità!
Per anni ho avuto uno script in cui disegnavo grafici bivariati in un gruppo di adattamento, in questo modo:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
La cosa fondamentale qui è che ottengo un elenco di parametri sotto forma di elenco di stringhe e poi li rappresento graficamente uno per uno.
Ora devo passare da Bivariate Plot a Graph Builder a causa di alcune funzionalità presenti in Graph Builder e non in Bivariate.
Ho capito come far sì che il grafico del Generatore di Grafici abbia esattamente lo stesso aspetto di Bivariate, ma non riesco a capire se esista un modo semplice per disegnare i GB in un Gruppo di Adattamento come sopra. Sembra che il Gruppo di Adattamento possa gestire i GB in questo modo:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
Ma per un elenco arbitrario di parametri devo scriverlo in un ciclo. Speravo in qualcosa di più semplice, come (ovviamente non funziona):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
C'è un modo per consentire a GB di prendere un elenco di parametri e di generare un elenco di DisplayBox?
Automazione e scriptingRe: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Ci eri quasi. Devi scriverlo in un ciclo. Quello che segue sembra funzionare. Potresti sostituire l'elenco di colonne con un output GUI o, se non hai dimestichezza con lo scripting GUI, potresti anche scrivere uno script per "ottenere le colonne selezionate", selezionare le colonne da tracciare e poi convertirlo programmaticamente nell'elenco.
Il punto di forza del Graph Builder è l'interattività. Questo lo rende meno adatto per avere più grafici in una finestra, poiché ognuno di essi dovrebbe essere modificato (ammesso che sia necessario), ma la programmazione semplifica il tutto (o quasi).
Un metodo che ho a disposizione è quello di utilizzare uno script che genera output su diverse piattaforme, tra cui y per x e GB. Ma genera anche il commutatore di colonna. Poi c'è un pulsante per tracciare ogni output nell'elenco del commutatore di colonna in un registro. Ovviamente, nessuna interattività.
comunque, ecco lo script leggermente modificato
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Per Graph Builder dovresti usare Page per ottenere un effetto simile, ma questo se il corso richiede che i tuoi dati siano in un formato specifico. Oppure Column Switcher.
Se non puoi usare Page, ti consiglio di eliminare Fit Group da Graph Builder. Raccogli i grafici in Lineup Box in modo che possano essere facilmente raggruppati in righe.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
Se desideri poter modificare il numero di report presenti in ogni riga, puoi farlo con Lineup Box
<< N Col(1);
Se necessario, è possibile aggiungere degli script alla casella di riepilogo di livello più alto.
Se desideri utilizzare Fit Group, puoi farlo, ma richiede la gestione di alcune espressioni. Puoi anche creare una funzione che lo faccia per te se devi farlo spesso.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"I vincoli che ho sono i seguenti:
Questo script fa parte di un componente aggiuntivo. Attualmente accetta come input un elenco di colonne in una stringa di testo (generata tramite GUI).
E non ho bisogno di interattività, ho bisogno di un formato preciso delle trame concordato con il cliente.
Sto passando a GB perché a quanto pare Fit Y by X non ha un modo semplice per visualizzare le barre di errore. Il cliente all'improvviso vuole le barre di errore sul grafico.
La domanda riguarda il modo più efficiente per produrre un elenco di GB anziché un singolo GB. Speravo in una funzionalità non documentata che permettesse di farlo allo stesso modo di Fit Group e Fit Y by X.
Ma sembra che dovrò scrivere degli script per i loop.
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Penso che dovrò passare a Line Up Box. Non volevo farlo perché richiederebbe modifiche più invasive al codice, ma non mi piacciono molto le espressioni di scripting. Spero solo che:
1. Non utilizzo alcuna funzionalità specifica di questo Fit Group in nessun'altra parte del codice
2. Sarò in grado di farlo apparire esattamente come Fit Group nell'output.
Tuttavia, mostrerò un codice di esempio dell'output finale.
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Domanda per te.
Il tuo script funziona perfettamente dopo aver corretto un evidente errore di battitura:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
che poi si aggiunge a 'lub' senza problemi.
Ho riscritto il primo copione che hai suggerito in una forma leggermente diversa:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
nel mio caso 'listOfGBs' viene visualizzato anche come:
{Graph Builder[], Graph Builder[]}
ma poi in linea:
lub << Append( listOfGBs );
genera errore:
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
Qualcuno sa perché?
Proverò a fare qualche prova, ma vorrei mantenere GB in una funzione.
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Anche il tuo script smette di funzionare non appena faccio questo:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
Dal punto di vista semantico non dovrebbe esserci alcuna differenza se utilizzo direttamente l'espressione di Graph Builder o se ho una variabile per rappresentarla: questa era la mia interpretazione. Perché questo interrompe lo script?
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Ok, funziona in questa forma:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
Posso usare sia la funzione (a modo mio) sia l'espressione (in pratica a modo tuo);
Non so quale fosse il problema precedente, ma a quanto pare devo creare LineUp Box all'interno della funzione e restituirlo invece dell'oggetto GB.
Re: Sostituzione di "Bivariate" con "Graph Builder" in un "Fit Group"Stai aggiungendo un elenco e non dei grafici alla casella di allineamento. Modificherei il tuo script in qualcosa del genere.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
Bisogna fare un po' di attenzione quando si creano i grafici. Generalmente, questo può essere evitato iniziando a sperimentare con le espressioni, ma sarà necessario crearle. Inoltre, se non è necessario raccogliere i riferimenti, sarà leggermente più semplice, poiché non sarà necessario usare il comando Inserisci in. E si possono ottenere in seguito con << XPath.
Scopri di più...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;