Ciao. Sono interessato a sapere che esiste un metodo di scripting per leggere i valori visualizzati per un asse in Graphbuilder e restituirli come elenco. IOW, esiste una funzione o un messaggio che può "ottenere" i valori dell'asse da un riferimento del generatore di grafici o da una casella dell'asse? Qualcosa come: xval_lis = gb << Ottieni valori dell'asse X.
Supponiamo ad esempio di avere il seguente grafico:

dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size(513, 406),
Show Control Panel(0),
Back Color("White"),
Variables(X(:age), X(:sex, Position(1)), Y(:weight)),
Elements(Points(X(1), Y, Legend(1)), Smoother(X(1), Y, Legend(2))),
Local Data Filter(
Add Filter(
columns(:age),
Where(:age == {12, 13, 14}),
Display(:age, Size(170, 96), List Display)
)
),
SendToReport(Dispatch({}, "", AxisBox, {Select}))
)In questo caso, poiché l'utente ha escluso determinate età utilizzando il filtro dei dati locali, non tutte le età nella tabella vengono visualizzate nell'asse x. In questo caso vorrei un modo per leggere quali età sono effettivamente visualizzate nel grafico. Questa domanda si applica solo quando per l'asse viene utilizzata una variabile di tipo nominale o ordinale (nessuna variabile continua).
Ho considerato il seguente metodo di scripting:
1. Leggere il filtro dati locale
2. Creare una tabella di sottoinsiemi delle sole righe non filtrate
3. Utilizzare la funzione Riepiloga su quella tabella per ottenere l'elenco dei valori degli assi visualizzati
ldf_str = ldf << Get Where Clause; //ldf = reference to local data filter in gb window
clause = Parse(Regex(ldf_str, "Select Where\((.+)\)$", "\1"));
r = dt << Get Rows Where(Eval(clause)); //dt = ref to main datable
dtsub = dt << Subset(//Invisible,
Selected Rows(0),
Rows(r),
Selected columns only(0)
);
Summarize(dtsub, xlev_lis = By(:age, :sex));
Questo metodo sembra ingombrante però. Esiste un comando in grado di "ottenere" i valori dell'asse da un riferimento del generatore di grafici o da una casella dell'asse?
@nikles ,
Non sono sicuro del tuo scenario utente, tuttavia, se l'utente sta filtrando attivamente, può anche modificare la struttura di GraphBuilder, ruoli diversi, ecc. Quindi un Gestore di modifica del filtro sarebbe più robusto. Si noti inoltre che Where Clause() non acquisisce l'Inverse. Lo script e la casella di testo di Where cattura l'inverso come Not (!)

Di seguito e in allegato c'è uno script che ottiene gli Xtick e li stampa nel registro quando il filtro cambia.Ecco una schermata del registro incorporato con commenti (//) e feed di riga aggiuntivi.

Names Default to Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size(513, 406),
Show Control Panel(0),
Back Color("White"),
Variables(X(:age), X(:sex, Position(1)), Y(:weight)),
Elements(Points(X(1), Y, Legend(1)), Smoother(X(1), Y, Legend(2))),
Local Data Filter(
Add Filter(
columns(:age),
Where(:age == {12, 13, 14}),
Display(:age, Size(170, 96), List Display)
)
),
SendToReport(Dispatch({}, "", AxisBox, {Select}))
);
//iftb = (report(gb)[PictureBox(1)]<<SIB></SIB>
Appunti:
- La riga 20 è commentata; mostra come ottenere un handle per Where TextBox.
- Le caratteristiche principali della funzione f utilizzata per il Filter Change Handler sono le capacità dell'implementazione JMP di Associative Array: metodi multipli per definirlo; per ottenere valori univoci in un elenco; quasi tutti gli oggetti JMP possono essere usati come chiave.
- Altre caratteristiche chiave sono: dt[ zz, _xvar_] è un elenco di valori di riga e ldf << ottiene righe filtrate.