Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Ciao a tutti,
Sto sviluppando un'applicazione JMP che utilizza l'integrazione di Python per offrire agli utenti dell'applicazione la flessibilità di caricare qualunque File di dati (Excel) con dati di processo industriale. Questa applicazione include più finestre di moduli e script estesi.
Una cosa che sto cercando di fare è semplicemente tracciare tutti i dati da un file di dati caricato un grafico , dove la prima colonna è sempre l'ora (X) e le colonne rimanenti sono le variabili di processo (Y). Ho creato un modulo con un riquadro grafico per visualizzarlo una volta eseguita l'applicazione e caricati i dati, ma sto riscontrando problemi con lo script di questa funzionalità. Poiché non so quante colonne ci saranno in un determinato file di dati, né come sono intitolate, ho bisogno che lo script accetti automaticamente tutte le Y (tutte le colonne di dati diverse dalla prima) e le passi attraverso il grafico.
Giocando con le diverse opzioni di grafica di JMP, non sono stato in grado di ottenere grafici di serie temporali per mostrare più grafici sovrapposti, quindi ho provato a creare script con Graph Builder. Quando traccio manualmente i dati in Graph Builder, posso selezionare tutte le colonne che voglio e trascinarle su Graph Builder Y e viene visualizzato come voglio, con tutti i dati mostrati su un grafico. Tuttavia, quando provo a scrivere questo script, Graph Builder mostra solo la prima variabile Y che passo attraverso lo script.
Non sono sicuro di come risolvere questo problema. Tutti i consigli/altri suggerimenti sono molto apprezzati!
Grazie!
- Estelle
PS Se esiste un altro modo per rappresentare graficamente questi dati in questo modo senza utilizzare Graph Builder, faccelo sapere. Preferisco che questa applicazione mostri all'utente solo il risultato rappresentato graficamente e non tutte le funzionalità aggiuntive disponibili quando si utilizza Graph Builder.
GraficaSceneggiaturaRi: Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Grazie mille per le utili informazioni e consigli. Lo apprezzo molto!
Ri: Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Combinando la soluzione io e @txnelson fornito in precedenza dovresti essere in grado di modificare point/smoother e così via. Per prima cosa crea il grafico con JMP (non c'è bisogno di avere tutte le colonne sull'asse y, puoi usarne solo due). Analizzerò il processo su come svilupperei questo script (sarà un po' lungo):
1. Aprire i dati di esempio JMP. In questo caso Semiconductor Capability.jmp come so ha molte colonne
2. Crea un grafico nel generatore di grafici con alcune colonne come asse X e due come asse Y

Prendi il copione
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
)
3. Cambia i punti in linea e cambierò anche la statistica di riepilogo dal valore predefinito, così posso vedere come è possibile modificarla nello script

Prendi il copione
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
)
4. Ora ho degli script di base abbastanza buoni per iniziare a lavorare su questo. Perché lo so Ri: puoi costruirlo senza scrivere l'espressione una stringa? può essere utilizzato per risolvere questo problema, lo uso come linea di base (script che ho fornito in precedenza).
Con grafico di base:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);
Ora, se volessi avere Line invece di punti, controllerei cosa devo cambiare nello script "line" che JMP mi ha dato in precedenza. Fondamentalmente dovrò aggiungere elementi.
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
Per fortuna questi sono stati aggiunti nell'altro post
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
var_line = Expr(Line(X));
For Each({col, idx}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
yline_expr = Parse("Y("||char(idx)||")");
Insert Into(var_line, Name Expr(yline_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
Elements(yyy)
)
),
Expr(vvv), Name Expr(var_expr),
Expr(yyy), Name Expr(var_line)
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);

(Non ho modificato le statistiche di riepilogo, ma dovrebbe essere abbastanza facile cambiarle inserendo alcune espressioni in più in var_line prima della creazione del generatore di grafici)
yline_expr = Expr(Legend(6));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />yline_expr = Expr(Summary Statistic("Median"));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />
Sapendo come usare Expr, Substitute, NameExpr e così via ho imparato attraverso questi due post nella community Inserisci un'espressione in un'altra usando Eval Insert, Eval Expr, Parse e Substitute , Funzioni di gestione delle espressioni: Parte I - Svelare Expr(), NameExpr(), Eval(), ... Enigma e con un sacco di tentativi ed errori (mi confondo ancora con loro, specialmente con Name Expr)
E infine, se dovessi combinare questo script con lo script che hai (lo ripulirei di più, cambierei l'ordine delle espressioni, molto probabilmente precompila i selettori di colonna e forse fornirei un'opzione per selezionare quale tipo di grafico usare, ma questo dovrebbe dare un'idea):
Visualizza di più...
Names Default To Here(1);
//the data table you want to operate on
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//number of columns in the data table
numcol = N Col(dt);
selectorwindow = New Window("Column Selector",
<<MODAL></MODAL>
Ri: Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Grazie per la risposta e il suggerimento "<
Una cosa che non vedo/capisco è come specificare se voglio che questo grafico utilizzi Line o Smoother e Point o forse qualche altra combinazione di elementi del grafico, poiché non ho deciso cosa sia meglio per il mio utilizzo. C'è un modo per aggiungerlo a questo?
Grazie!
- Estelle
Ri: Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Grazie per la risposta! Ho provato a utilizzare lo script generato da JMP e a regolarlo, ma continuo a riscontrare questo problema. Di seguito è riportato uno script su cui ho lavorato per vedere quali risultati posso ottenere:
//the data table you want to operate on
datafile = Open( "Data.xlsx");
//number of columns in the data table
numcol = ncol(datafile);
selectorwindow = New Window("Column Selector", /*<<MODAL></MODAL>);Credo che uno dei miei problemi possa essere dovuto al fatto che non sono esattamente sicuro di come specificare la parte "Elementi" per accettare un numero qualsiasi di Y. Per questo script specifico, non importa se aggiungo più Elements( Line (Y(1), Y(2), Y(3), etc )) e cambio le colonne che seleziono come Y, ottengo comunque solo una variabile tracciata.
Grazie!
- Estelle
Ri: Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Sembra che tu stia generando il tuo JSL da zero... come farebbe un programmatore Python, piuttosto che prendere il Generatore di grafici interattivo che hai prodotto e quindi fare in modo che JMP generi il JSL che creerà il grafico.Se creo interattivamente il grafico sottostante,

Andando sul triangolo rosso e selezionando "Script" si produce uno script che gestisce entrambe le variabili dell'asse Y
Graph Builder(
Size( 528, 448 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y( :height ), Y( :weight, Position( 1 ) ) ),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
5,
Base( 0, 0, 0, Item ID( "height", 1 ) ),
Base( 1, 0, 0, Item ID( "weight", 1 ) )
)}
)
)
);
Ora, se il tuo problema è che quando prendi uno script come quello sopra e stai cercando di espanderlo per gestire tutte le colonne Y di cui hai bisogno, a volte può richiedere un po' più di lavoro.
Ecco la stessa struttura di un grafico, ma con molte più colonne Y

Ecco il JSL espanso prodotto da JMP per ricreare il grafico
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
Qui è dove il programmatore JSL deve creare la stringa di comando da eseguire per passare a Graph Builder.Se lo stai già facendo e stai ricevendo solo la prima variabile Y nel grafico, in genere ciò che sta accadendo è che Graph Builder non è in grado di valutare le informazioni che gli vengono passate.Se fornisci il JSL che stai utilizzando, la community di solito è abbastanza brava ad aiutarti.
Ri: Come eseguire lo script di tutti i dati X e Y in un unico grafico di serie temporali nell'applicazione JMP?Questo argomento potrebbe essere utile:
Ri: puoi costruirlo senza scrivere un'espressione una stringa?
Molte espressioni qui, inoltre puoi usare << Ottieni immagine per "rimuovere funzionalità" dal generatore di grafici
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);