Come collegare le selezioni del grafico con JSL?Ciao a tutti!
Sto usando Application Builder e ho diversi grafici che ho scritto usando Graph Builder. Molti dei grafici utilizzano diverse tabelle di dati che sono state gestite utilizzando Python e inviate nuovamente a JMP. Poiché i dati vengono sottoposti a un'elaborazione significativa in Python, queste tabelle non includono nessuna delle stesse variabili.Sto cercando un modo per collegare le selezioni su questi grafici (come se si seleziona una delle etichette della legenda e gli elementi non selezionati vengono disattivati) utilizzando JSL.
Ad esempio, sto rappresentando graficamente i miei dati grezzi e i miei dati del "prodotto finale", che hanno dimensioni notevolmente ridotte e caratteristiche simili sono raggruppati insieme, quindi in Table1/Graph1 possono esserci 30 colonne e in Table2/Graph2 ce ne sono solo 3. Se ho una casella di riepilogo con le variabili Table2 e seleziono Variable1, vorrei poter evidenziare Variable1 su Graph2, ma anche evidenziare le informazioni rilevanti in Graph1. Posso determinare le colonne/righe pertinenti da evidenziare, ma non sono riuscito a trovare come impostare effettivamente tali selezioni sul grafico. Sarebbe anche fantastico se potessi selezionare una delle etichette della legenda su un grafico (dove disattiva automaticamente gli elementi non selezionati) e scrivere qualcosa in modo che selezioni le informazioni rilevanti sugli altri grafici.
Esiste una linea JSL per evidenziare qualcosa su un grafico come questo?
Personalizzazione di massaRi: Come collegare le selezioni del grafico con JSL?I gestori dello stato della riga si attivano su tutte le modifiche allo stato della riga. Quindi, quando scegli 1 riga, attivi (almeno) due eventi; uno deseleziona e uno seleziona. Molto probabilmente questo sta causando alcuni problemi e potrebbe facilmente causare loop. Se potessi catturare solo eventi specifici (selezionare, deselezionare, nascondere, escludere...) forse funzionerebbe.
Ri: Come collegare le selezioni del grafico con JSL?Vedo... Grazie per le informazioni! Dato che sto chiudendo questo capitolo sui gestori dello stato di riga lol, ho deciso di provare di nuovo l'idea "<< Aggiungi script grafici" fornita sopra, ma questa volta con i flag. Quando implementato senza flag, sembra mostrare lo stesso (cattivo) comportamento con cui avevo a che fare sopra, ma con flag sembra funzionare!
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
Spero che questo continui a funzionare man mano che espando le connessioni grafiche. Qualche idea sul motivo per cui i gestori dello stato di riga acquisiranno continuamente la "selezione" più e più volte (creando così un ciclo tra i grafici e congelando JMP) e perché lo stesso JSL in uno script grafico non lo fa?
Apprezzo molto l'aiuto @jthi & @txnelson !
Ri: Come collegare le selezioni del grafico con JSL?Gestito, a un certo punto, per generare un messaggio "utile" nel registro avanzato

Ri: Come collegare le selezioni del grafico con JSL?Ci sono alcune cose non così divertenti in corso con Row State Handlers (cerco sempre di evitarle, perché secondo me non funzionano abbastanza male). Prova a eseguire l'esempio che ho fornito facendo clic su singole righe in Big Class e vedi JMP Log.
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
Ri: Come collegare le selezioni del grafico con JSL?Questo è quello che ho provato, ma non credo di capire abbastanza bene gli stati/il gestore dello stato di riga/i flag. Ho allegato un video di quanto descritto sopra. Il grafico mostrato è relativo a f2 e dt2:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);All'inizio pensavo che il trascinamento stesse causando un problema perché la selezione cambiava con ogni nuovo punto aggiunto fino al completamento del trascinamento, ma in base all'output "group_selected" nel registro, non sembra nemmeno che la selezione stia cambiando . Mi sembra che il ciclo sia dovuto all'aggiunta di una nuova selezione all'interno del gestore dello stato di riga, ma non sono sicuro di come evitarlo per raggiungere il mio obiettivo di entrambi i grafici (e alla fine di più) che puntano l'uno verso l'altro.
Tutti i suggerimenti sono i benvenuti.
Ri: Come collegare le selezioni del grafico con JSL?Userei le istruzioni Show () per visualizzare lo stato del flag nel registro, quindi eseguo il trascinamento per vedere se è possibile determinare dove si trova il problema di temporizzazione.
Ri: Come collegare le selezioni del grafico con JSL?Grazie mille per la risposta, @txnelson ! Usare i flag è una buona idea. Sfortunatamente, sto ancora riscontrando alcuni problemi di ricorsione ... Ho giocato con diverse posizioni della variabile flag e con la mia comprensione limitata del JSL con cui sto giocando, questa sintassi attuale ha più senso per me (quasi esattamente come è strutturato il tuo pseudo codice).Ecco il mio:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />Quanto sopra funziona se effettuo selezioni facendo clic sulle etichette della legenda (yay!) e se eseguo selezioni singolari facendo clic su singoli indicatori sulla trama (yay!), ma entra in un ciclo se provo a effettuare selezioni trascinando un riquadro di selezione sulla trama reale (che è lo scenario più probabile del mio utente).Le mie variabili flag dovrebbero essere diverse per ogni funzione separata? L'unico modo in cui attualmente posso farlo funzionare come ho descritto è utilizzando la stessa variabile flag ... C'è semplicemente qualcosa che sto trascurando?
Sembra anche che in qualche modo cambi la mia variabile flag "già_run" se passo il mouse sopra il grafico senza fare clic su nulla. Ciò è dovuto al modo in cui funziona il gestore dello stato di riga?
Apprezzo il vostro aiuto!
Ri: Come collegare le selezioni del grafico con JSL?Tutti i grafici che sono stati generati dalla stessa tabella dati, avranno automaticamente i loro punti, linee, ecc. selezionati, quando in uno dei grafici sono selezionati punti, linee, ecc.
Se i grafici provengono da 2 tabelle diverse, è possibile costruire un gestore dello stato di riga per ciascuna delle tabelle di dati.Hai ragione nella tua affermazione su un argomento circolare, tuttavia, il modo in cui l'ho gestito è impostare un flag in ciascuno dei gestori che impedisce la continuazione del ciclo.
Ecco un semplice pezzo di pseudo codice che dovrebbe darti un'idea su come configurarlo
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );Ri: Come collegare le selezioni del grafico con JSL?C'è un modo per utilizzare i gestori dello stato di riga in modo che una selezione su Graph1 evidenzi le informazioni rilevanti su Graph2 E viceversa? Posso farlo in un modo o nell'altro, ma sembra che se voglio fare entrambe le cose, diventa un argomento circolare che blocca JMP ....Esiste un modo intelligente per puntare entrambi i grafici/datatable all'altro che non si traduca in argomenti circolari?
Ri: Come collegare le selezioni del grafico con JSL?Quando si selezionano punti o linee in un grafico Costruttore di grafici, bivariato e così via, le righe associate alla selezione vengono selezionate nella tabella dati associata.Questo indipendentemente dal fatto che la tabella sia visibile o meno.Pertanto, è abbastanza semplice implementare un gestore dello stato di riga, che verrà eseguito ogni volta che viene rilevata una modifica nella selezione delle righe.
Ri: Come collegare le selezioni del grafico con JSL?Grazie per la risposta, @jthi ! Non sono sicuro che queste soluzioni siano applicabili nel mio caso a meno che non ci sia un modo per determinare le righe/colonne/indice/ecc. selezionate semplicemente da una selezione effettuata sul grafico. Nessuna delle tabelle di dati utilizzate nella mia app è visibile per consentire all'utente di effettuare selezioni in... L'idea è solo di interfacciarsi con le visualizzazioni e il codice esegue tutte le manipolazioni sui tavoli dietro le quinte.
Sento che ci deve essere qualche iterazione di "<< Get Selected" per le selezioni del grafico, ma non ho trovato la giusta implementazione nell'indice di scripting. Se c'è una riga JSL per questo, allora penso che l'idea "<< Add Graphics Script" che hai menzionato potrebbe funzionare abbastanza bene una volta che le selezioni sono state fatte!
Ri: Come collegare le selezioni del grafico con JSL?Non ho mai utilizzato Application Builder, ma potresti utilizzare i gestori dello stato di riga.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
Un'altra opzione potrebbe essere quella di utilizzare Graph Script:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
Un'altra opzione sarebbe quella di utilizzare Virtual Join, ma questi richiederebbero di avere tabelle di dati salvate da qualche parte.