Come eseguire lo script di tutti i dati X e Y in un singolo grafico di serie temporali nell'applicazione JMP?Ciao a tutti,
Sto sviluppando un'applicazione JMP che utilizza l'integrazione Python per offrire agli utenti dell'applicazione la flessibilità di caricare qualsiasi 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 su un grafico , dove la prima colonna è sempre il tempo (X) e le colonne rimanenti sono le variabili di processo (Y). Ho creato un modulo con una casella grafica per visualizzarlo una volta eseguita l'applicazione e caricati i dati, ma ho problemi a creare script per questa funzionalità. Poiché non so quante colonne ci saranno in un dato file di dati, né quale sia il loro titolo, 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 grafiche di JMP, non sono riuscito a ottenere che i grafici delle serie temporali mostrino più grafici sovrapposti, quindi ho provato a creare script con Graph Builder. Quando traccio manualmente i dati nel Costruttore di grafici, posso selezionare tutte le colonne che desidero e trascinarle nel Costruttore di grafici Y e viene visualizzato come voglio, con tutti i dati mostrati su un grafico. Tuttavia, quando provo a creare uno script, il Costruttore di grafici mostra solo la prima variabile Y che passo attraverso lo script.
Non sono sicuro di come risolvere questo problema. Qualsiasi consiglio/altro suggerimento è molto apprezzato!
Grazie!
- Estelle
PS Se esiste un altro modo per rappresentare graficamente questi dati in questo modo senza utilizzare il Costruttore di grafici, faccelo sapere. Preferisco che questa applicazione mostri all'utente solo il risultato rappresentato graficamente e non tutte le funzionalità aggiuntive disponibili quando si utilizza il Costruttore di grafici.
Automazione e scriptingRi: Come inserire tutti i dati X e Y in un singolo grafico di serie temporali nell'applicazione JMP?Grazie mille per le utili informazioni e consigli. Lo apprezzo molto!
Ri: Come inserire tutti i dati X e Y in un singolo grafico di serie temporali nell'applicazione JMP?Combinando la soluzione me e @txnelson fornito in precedenza dovresti essere in grado di modificare punto/smussare e così via. Per prima cosa crea il grafico con JMP (non è necessario avere tutte le colonne sull'asse y, puoi usarne solo due). Passerò attraverso il processo di sviluppo di questo script (sarà un po' lungo):
1. Aprire i dati di esempio JMP. In questo caso Semiconductor Capability.jmp come so che ha molte colonne
2. Creare un grafico nel generatore di grafici con una colonna come asse X e due come asse Y

Prendi la sceneggiatura
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 può essere modificata 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 script di base abbastanza buoni per iniziare a lavorare su questo. Perché lo so Re: Puoi costruirlo senza scrivere espressione una stringa? può essere utilizzato per risolvere questo problema, lo uso come 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 avrò bisogno di aggiungere elementi.
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
Fortunatamente 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 semplice modificarle inserendo alcune altre espressioni 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 />
Sapere 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 (vorrei ripulirlo di più, cambiare l'ordine delle espressioni, molto probabilmente precompilare i selettori di colonna e forse fornire un'opzione per selezionare il tipo di grafico da usare, ma questo dovrebbe dare un'idea):
Visualizza altro... Ri: Come inserire tutti i dati X e Y in un singolo grafico di serie temporali nell'applicazione JMP?Grazie per la risposta e per il suggerimento "<
Una cosa che non vedo/capisco è come specificare se voglio che questo grafico utilizzi Line o Smoother and Point o forse qualche altra combinazione di elementi grafici, poiché non ho deciso cosa è meglio per il mio uso. C'è un modo per aggiungerlo a questo?
Grazie!
- Estella
Ri: Come inserire tutti i dati X e Y in un singolo grafico di serie temporali nell'applicazione JMP?Grazie per la risposta! Ho provato a utilizzare lo script generato da JMP e ad aggiustarlo, 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 potrebbe risiedere nel 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!
- Estella
Ri: Come inserire tutti i dati X e Y in un singolo 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 Graph Builder 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 al triangolo rosso e selezionando "Script" 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 ottieni solo la prima variabile Y nel grafico, in genere ciò che accade è 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 inserire tutti i dati X e Y in un singolo grafico di serie temporali nell'applicazione JMP?Questo argomento potrebbe essere utile:
Ri: Puoi costruirlo senza scrivere espressione una stringa?
Molte espressioni qui, puoi anche 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
);