Utilizza l'elenco variabile di colonne come asse Y nel Costruttore di graficiGente,
Ho appena effettuato l'aggiornamento da JMP14 Pro a JMP15 Pro e sto riscontrando problemi con molti dei miei script JSL che utilizzano OverlayPlots.Sto cercando di convertire alcuni dei miei OP più complessi in GB e sto riscontrando un singhiozzo quando utilizzo gli elenchi di variabili in GB.Con gli OP il codice seguente ha tracciato con successo tutte le variabili per un determinato file di dati che soddisfacevano i criteri Y (Eval List ( ???? )).Ho creato questo codice per tenere conto del fatto che vari siti sul campo possono avere un numero diverso di sensori presenti che desidero tracciare.
// Potential Tair Data
pot_tair_list = {"Datalogger Internal Temperature (C)", "Air Temperature - HMP - 5m (C)", "Air Temperature - HMP (C)",
"Air Temperature, STD - HMP (C)", "Air Temperature - WXT (C)", "Air Temperature @ 5m - HMP (C)", "Air Temperature - MA4100 (C)",
"Air Temperature - EE181 (C)", "Air Temperature - WS700 (C)", "Air Temperature - GMX541 (C)"};
// Create empty list to hold names of the those measurement variables found in data table
act_tair_list = {};
// Run through data table column names and put those that match measurement variable list into new list
For( i = 1, i <= N Items( pot_tair_list ), i++,
If( Contains( dt_col_name_list, pot_tair_list[i] ),
Insert Into( act_tair_list, pot_tair_list[i] )
)
);
******************************
// Plot Air Temperature data
If( N Items( act_tair_list ) > 0,
Graph Builder(
Size( 1600, 500 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Legend Position( "Right" ),
Fit to Window( "Off" ),
Graph Spacing( 3 ),
Variables( X( :Name( "Date & Time" ) ), Y( Eval List( act_tair_list ) ) ),
Elements( Line( X, Y, Legend( 4 ) ), Points( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
"Date & Time",
ScaleBox,
{Format( "m/d/y", 10 ), Min( sdate ), Max( edate ), Interval( "Day" ), Inc( 28 ), Minor Ticks( 0 )}
),
Dispatch(
{},
Y( Eval List( act_tair_list ) ),
ScaleBox,
{Format( "Fixed Dec", 10, 0 ), Inc ( 5 ), Show Major Grid( 1 ), Minor Ticks( 0 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model( 1, Properties( 0, {Line Color( 3 ), Fill Color( 0 )}, Item ID( "Battery (V)", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 1 )} )
)
)
);
A GB non piace la stessa costruzione dell'elenco che ho usato con gli OP e genera il seguente errore:
Colonna specificata non trovata nella tabella dati.{191471} nell'accesso o nella valutazione di 'Y', Y( Eval List( act_tair_list ) ) /*###*/Eccezione nel lancio della piattaforma{191471} nell'accesso o nella valutazione di 'Graph Builder '
Ho completato la maggior parte dei miei grafici JSL utilizzando la piattaforma OP e non ho le conoscenze su come risolvere questo problema.
È possibile passare un elenco di variabili a GB per l'asse Y e, in tal caso, che aspetto ha quel formato? Apprezzerei qualsiasi aiuto per risolvere questo problema in modo da poter continuare a utilizzare un unico script grafico per tutte le variabili in tutti i siti sul campo, indipendentemente dai sensori specifici effettivamente presenti.Grazie.
Ri: Utilizzare l'elenco variabile di colonne come asse Y nel Costruttore di graficiNames Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
var expr = Expr( Variables( X( :Weight ) ) );
For( c = 1, c <= N Items( col ), c++,
y expr = Expr( Y( Position( 1 ) ) );
Insert Into( y expr, col[c], 1 );
Insert Into( var expr, Name Expr( y expr) );
);
Eval(
Substitute(
Expr(
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
vvv,
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
),
Expr( vvv ),
Name Expr( var expr )
)
);Ri: Utilizzare l'elenco variabile di colonne come asse Y nel Costruttore di graficiL'idea è semplice. Substitute() cerca un'espressione all'interno di un'espressione, quindi ho inserito un'espressione insolita, vvv, all'interno dell'espressione principale in modo che sia l'obiettivo inequivocabile. La funzione lo sostituisce con l'espressione che ho creato per le colonne nel ruolo Y.
Non so cosa intendi con " richiamando l'elenco delle variabili effettive alla fine dell'istruzione GB. " Non sto facendo nulla del genere. Immagino a cosa potresti riferirti, posso solo dire che sei confuso sulla differenza tra il codice in esecuzione e le espressioni. Inoltre, gli argomenti con nome in una chiamata di funzione o nell'invio di un messaggio sono indipendenti dalla posizione.
Potrebbe essere istruttivo selezionare l'espressione Eval() ed eseguire questo codice da solo. Genera una nuova espressione che viene valutata.
Questo caso è una semplice applicazione di espressioni. Dovresti studiare la Guida allo scripting JMP o frequentare uno dei nostri corsi sull'introduzione dello scripting.
Ri: Utilizzare l'elenco variabile di colonne come asse Y nel Costruttore di graficiSegno,
L'altro aspetto della tua soluzione è che traccia ciascuna variabile in un pannello separato anziché tutte sullo stesso pannello, che in definitiva è ciò che voglio.Il codice seguente illustra ciò che voglio produrre.Ho provato diverse modifiche al tuo codice ma senza alcun risultato.Ti dispiacerebbe fornire un suggerimento su come posso realizzare questo?Grazie.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
Graph Builder(
Fit to Window( "Off" ),
Graph Spacing( 3 ),
Variables(
X( :Weight ),
Y( :Runtime ),
Y( :RunPulse, Position( 1 ) ),
Y( :RstPulse, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Line( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "Runtime", 1 ) ),
Base( 1, 0, 0, Item ID( "RunPulse", 1 ) ),
Base( 2, 0, 0, Item ID( "RstPulse", 1 ) )
)}
),
Dispatch(
{},
"400",
LegendBox,
{Legend Position( {3, [-1, -1, -1], 6, [0, 1, 2]} ),
Position( {-1, -1, -1, 0, 1, 2} )}
)
)
);
Ri: Utilizzare l'elenco variabile di colonne come asse Y nel Costruttore di graficiGrazie Marco per il suggerimento molto utile,
Puoi spiegare perché è necessario utilizzare quello che sembra un segnaposto, vvv, invece di chiamare Name Expr ( var expr ) in questa posizione?Vedo che quando lo faccio non viene prodotto alcun grafico, ma non mi è chiaro il motivo per cui vvv e la chiamata dell'elenco delle variabili effettive alla fine dell'istruzione GB invece di dove le variabili vengono normalmente dichiarate.
Ri: Utilizzare l'elenco variabile di colonne come asse Y nel Costruttore di graficiL'avvio del Costruttore di grafici non funziona allo stesso modo dell'avvio di Overlay Plot. Overlay Plot utilizzava un argomento denominato Y() che accettava un riferimento di colonna o un elenco di riferimenti di colonna. Il Costruttore di grafici viene avviato con un argomento Y() separato per ciascuna colonna in quel ruolo. Ecco un esempio basato sulla tabella dati Fitness:
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables(
X( :Weight ),
Y( :Runtime ),
Y( :RunPulse, Position( 1 ) ),
Y( :RstPulse, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
Un approccio consiste nell'utilizzare le espressioni. Le funzioni Insert Into() e Substitute() semplificano la creazione dell'espressione di lancio necessaria.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
var expr = Expr( Variables( X( :Weight ) ) );
For( c = 1, c <= N Items( col ), c++,
y expr = Expr( Y() );
Insert Into( y expr, col[c] );
Insert Into( var expr, Name Expr( y expr) );
);
Eval(
Substitute(
Expr(
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
vvv,
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
),
Expr( vvv ),
Name Expr( var expr )
)
);Re: Utilizzare l'elenco variabile delle colonne come asse Y in Graph BuilderGrazie per l'ottima spiegazione. Sto cercando di insegnare Substitute ai dipendenti che stanno iniziando a usare gli script. Ho notato che questo esempio è hardcoded per i 3 grafici in questa sezione qui sotto. Se aggiungi una quarta colonna all'elenco (come col = {:Runtime, :RunPulse, :RstPulse, :MaxPulse}), traccia comunque solo 3 grafici in Graph Builder
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
Esiste un modo semplice per impostare queste espressioni anche nel ciclo For? Non sono sicuro se la nuova espressione debba iniziare con Elements() o se può essere fatto assemblando un'espressione Points() e un'espressione Smoother(), simili a "var expr"? Ci giocherò un po', ma volevo sapere se c'è qualche altro trucco su cosa Substitute potrebbe vedere come un'espressione o quale livello nell'espressione è consigliato per iniziare. Ad esempio, hai iniziato var expr con "Variables (X (:Weight)) e poi hai inserito le Y. Questa è una buona pratica?