Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?Nel grafico generato dallo script sottostante vorrei cambiare il colore delle linee indicate dalle frecce rosse ("le linee divisorie") in viola. Inoltre vorrei aggiungere una linea di riferimento orizzontale solo per la variabile più bassa dell'asse y (in questo caso PNP1).
Come eseguire queste operazioni tramite JSL?
(Nota che nel mio caso reale i dati dell'asse y non provengono da una colonna a differenza di questo caso di esempio)
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
Graph Builder(
Size( 960, 695 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch(
{},
"SITE",
ScaleBox,
{Label Row( 3, {Major Grid Line Color( 8 ), Show Major Grid( 1 )} )}
)
)
);
Automazione e scriptingfinestreRi: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?bella idea collegare le linee verticali e le etichette degli assi tramite colore 
Sfortunatamente, le linee sono così sottili che è difficile notare la funzione.
Se provi la stessa sensazione, per favore sostieni questo desiderio:
impostazioni grafiche ottimizzate per categorie X gerarchiche - 2 opzioni

in alternativa, potresti utilizzare il sito come Gruppo X, ma molto probabilmente riscontrerai il problema con le etichette dell'asse X sincronizzate.
C'è anche il desiderio di risolvere questo problema:
Gruppo X: limita i valori sull'asse al rispettivo gruppo
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt << Graph Builder(
Size( 841, 485 ),
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis Title( 0 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch( {}, "SITE", ScaleBox,
{Label Row(
1,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
2,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
3,
{Line Color( "Purple" ), Lower Frame( 1 ), Major Grid Line Color( "Purple" ),
Row Title Side( "Start" ), Tick Mark Style( "Long Divider" )}
)}
),
Dispatch( {}, "PNP1", ScaleBox, {Add Ref Line( 300, "Solid", "Black", "", 5 )} ),
Dispatch( {}, "Graph Builder", FrameBox( 4 ), {Reference Line Order( 3 )} )
)
)
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?cosa intendi con?
@Neo ha scritto:(Nota che nel mio caso reale i dati dell'asse y non provengono da una colonna a differenza di questo caso di esempio)
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?@hogi
>> (Nota che nel mio caso reale i dati dell'asse y non provengono da una colonna a differenza di questo caso di esempio)
Nel mio caso reale, i parametri dell'asse y provengono dalla selezione del filtro dati locale dei parametri di riga
(Se provenisse da una colonna, avrei potuto impostare un limite nelle specifiche per la linea di riferimento (non che l'abbia provato, ma mi aspetto che funzioni))
Fammi vedere se riesco a creare un set di dati per la demo (tornerò
).
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?CIAO @Neo ,
Il codice quello @hogi pubblicato risolverà il tuo problema per ottenere una linea di riferimento per una singola sottotrama all'interno del tuo generatore di grafici, ma sfortunatamente, guardando la struttura ad albero, non vedo un modo per inviare un comando che cambierebbe solo quella linea di x- asse. Nella struttura ad albero, l'intero asse x è raggruppato in un singolo elemento AxisBox(1), non è diviso e annidato, anche se viene visualizzato in questo modo nel costruttore di grafici. Inoltre, non sono riuscito a trovare nulla nelle preferenze che ti consenta di modificare le linee degli assi nidificati.
Puoi sempre fare clic con il pulsante destro del mouse su un asse che desideri avere e quindi aggiungere una linea di riferimento, quindi andare al pulsante rosso accanto al generatore di grafici e salvare lo script nella finestra di scripting e puoi vedere come lo script viene modificato dal aggiunta della linea.
Spero che questo ti aiuti!,
DS
Modifica: potrebbe valere la pena inviare una richiesta per poter modificare i colori degli assi nidificati. Questo dovrebbe essere fattibile e qualcosa di cui immagino che molte persone potrebbero trarne beneficio.
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?Quale linea è il problema?
Al momento, c'è solo una linea orizzontale nel grafico più basso.
Se devi nascondere parti delle linee di riferimento, puoi sfruttare il fatto che ogni sottotrama ha le proprie impostazioni di personalizzazione, quindi puoi aggiungere alcuni rettangoli e metterli davanti alla linea di riferimento.
[in alternativa, potresti anche utilizzare direttamente lo script di personalizzazione per aggiungere un segmento di linea.]

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt << Graph Builder(
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis Title( 0 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch( {}, "SITE", ScaleBox,
{Add Ref Line( 714.422378299564, "Solid", "Red", "", 4 ),
Label Row(
1,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
2,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
3,
{Line Color( "Purple" ), Line Width( 3 ), Lower Frame( 1 ),
Major Grid Line Color( "Purple" ), Row Title Side( "Start" ),
Tick Mark Style( "Long Divider" )}
)}
),
Dispatch( {}, "PNP3", ScaleBox, {Add Ref Line( 135, "Solid", "Red", "", 3 )} ),
Dispatch( {}, "PNP1", ScaleBox, {Add Ref Line( 300, "Solid", "Black", "", 5 )} ),
Dispatch( {}, "400", ScaleBox,
{Legend Model( 38, Properties( 0, {Transparency( 0.5 )}, Item ID( "PNP3", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox,
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( -10000, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 2 ),
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( -10000, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 3 ),
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( 290, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 4 ), {Reference Line Order( 3 )} )
)
)
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?@hogi @SDF1 In allegato c'è una tabella di dati elaborata (con script di trama all'interno) simile ai miei dati reali. Desidero che una linea di riferimento (rossa sotto) venga visualizzata solo quando viene selezionata la fase 3 del test nel filtro dati locale.
(la posizione Y della linea di riferimento è predefinita)

Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?@SDF1

Questo aggiunge linee di riferimento a tutte le sottotrame, il che non è quello che voglio.
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?Questo è il caso più semplice in cui, a causa del gruppo Y, i grafici sono suddivisi in diversi FrameBox. Quindi puoi semplicemente aggiungere singole linee di riferimento tramite Personalizza.

Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox( 3 ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Pen Size( 3 );
Y Function( 0.4, x );
)}
)
)
)Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?CIAO @Neo ,
farei come @hogi suggerito e utilizza l'opzione Personalizza quando fai clic con il pulsante destro del mouse sul grafico di interesse, fai clic su "+" per aggiungere un nuovo script a GB, quindi digita il JSL per aggiungere una riga.



Ora, per far sì che questo risponda dinamicamente al filtro dei dati locali, penso che sarebbe più impegnativo. Se hai bisogno di questo tipo di funzionalità, genererei invece la mia finestra di report con un generatore di grafici integrato e quindi magari utilizzerei le caselle di controllo per offrire all'utente la possibilità di aggiornare le sottotrame con linee di riferimento quando selezionano le diverse caselle di controllo TestStage.
Ho trovato anche un modo per cambiare il colore delle linee nidificate. Non so se questo è il modo "corretto" per farlo, o anche se è il modo più veloce, ma se fai clic con il pulsante destro del mouse sull'asse nidificato e poi selezioni mostra proprietà, se fai clic sull'asse nidificato e poi fai clic su il pulsante rosso accanto ad AxisBox, seleziona Copia impostazioni Axis, puoi quindi incollarlo in una finestra di scripting e modificarlo. Seleziona l'asse di interesse e modifica il colore della linea da "Nessuno" al colore che desideri. Devi quindi copiare questo codice modificato, tornare al pulsante rosso, selezionare Incolla impostazioni asse e il grafico verrà aggiornato. Questo porterà a termine il lavoro, ma non sono sicuro di come ciò possa essere fatto in modo dinamico.



Salvando lo script corrispondente in una finestra di scripting, puoi vedere i comandi necessari per inviare il Costruttore di grafici e la Riga di etichette per ottenere il risultato desiderato.
Graph Builder(
Size( 592, 526 ),
Y Group Edge( "Left" ),
Graph Spacing( 4 ),
Variables(
X( :TestStage ),
X( :TestParameter, Position( 1 ) ),
Y( :Median ),
Group Y( :TestStage )
),
Elements(
Points( X( 1 ), X( 2 ), Y, Legend( 33 ) ),
Smoother( X( 1 ), X( 2 ), Y, Legend( 34 ) )
),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == {1, 2, 3} ) )
),
SendToReport(
Dispatch(
{},
"TestStage",
ScaleBox,
{Label Row( 2, Line Color( "Purple" ) )}
),
Dispatch(
{},
"Graph Builder",
FrameBox( 3 ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Pen Size( 3 );
Y Function( 0.3, x );
)}
)
)
);Utilizzando queste informazioni e tornando al tuo post originale utilizzando il file Semiconductor Capability.jmp, puoi ottenere ciò che stavi chiedendo originariamente, l'asse nidificato è viola, le linee della griglia verticale sono viola e c'è una linea di riferimento solo per il grafico più in basso. In questo caso particolare, fare doppio clic sull'asse a cui desideri aggiungere la linea di riferimento funzionerà perché stai tracciando colonne diverse nelle sottotrame del generatore di grafici. Per la tabella dati di esempio che hai condiviso, devi fare il contrario con Personalizza e aggiungendo una funzione Y().

Ecco il codice JSL che ha generato il grafico sopra. Puoi vedere dove devi apportare le modifiche appropriate per il tuo caso specifico.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt<<GRAPH builder=""></GRAPH>
Spero che questo ti aiuti!,
DS
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?potresti calcolare la media dai valori stessi:
Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) )
);
myFB = Current Report()[FrameBox( 3 )];
myFB << Add Graphics Script(
2,
Description( "" ),
<STRONG> mySeg = myFB << Find Seg( Marker Seg( 1 ) );
value = Mean( mySeg << Get Y Values );</STRONG>
Pen Color( "red" );
Pen Size( 3 );
Y Function( value, x );
);
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?@SDF1 Grazie. Controllerò come sei riuscito a cambiare il colore dell'asse nidificato in viola. Nel frattempo ho usato @hogi suggerimento e Make Filter Change Handler () per modificare dinamicamente il punto in cui JMP inserisce la linea di riferimento quando l'utente modifica le selezioni del filtro. Non ho ancora risolto due problemi con questo.
1. Il gestore della modifica del filtro non si attiva quando il grafico viene tracciato per la prima volta ma solo quando viene selezionato il TestStage successivo.
2. Quando si cambia il filtro, la linea di riferimento precedente rimane su una fase di test diversa, e capisco il motivo, ma non sono ancora riuscito a rimuoverla.
Names Default To Here (1);
clear log ();
gb = Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == {1} ) )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
getTestStage = Function( {this}, //print (this);
testStateFiltered = Associative Array(:TestStage [ldf << get filtered rows]) << get keys;
gb << SendToReport(
Dispatch({},"Graph Builder",
FrameBox(N Items (testStateFiltered)), {Add Graphics Script( 2, Description( "" ), Pen Color( "red" ); Line Style ("dashed"); Pen Size( 0.25 );
Y Function( 0.2, x );
)}
)
);
show (N Items (testStateFiltered)); Print(testStateFiltered);
);
rs = ldf << Make Filter Change Handler( getTestStage() ); Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?A proposito, c'è una nuova funzionalità in Jmp17:
aggiungere linee di riferimento dinamiche in base a valori statistici
Graph Builder(
Y Group Edge( "Left" ),
Summary Statistic( "Median" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements(
Points( X, Y, Legend( 33 ) ),
Smoother( X, Y, Legend( 34 ) ),
Caption Box(
X,
Y,
<STRONG> Summary Statistic( "Median" ),
Location( "Axis Reference Line" )</STRONG>
)
),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == 1 ) )
)
)
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?CIAO @Neo ,
È un'idea davvero interessante @hogi riguarda l'utilizzo di un gestore di modifica del filtro. Non ci avevo pensato. Ho modificato il codice sopra per risolvere i due problemi che stavi riscontrando. Lo script creerà ora il primo grafico con la linea di riferimento e quindi aggiornerà ciascun grafico di conseguenza, anche quando si sceglie più di un filtro dati. Questo risolve il problema?
Names Default To Here( 1 );
dt = Current Data Table();
//this creates a string list of the column names
ColNamesList = dt << Get Column Names( "string" );
//This tests if the there exist a :Mean Column. If not, it runs a summary to generate this data, updates the main table with the means and then deletes a column and closes out the summary table.
If( Contains( ColNamesList, "Mean" ) == 0,
dtMeans = dt << Summary(
Group( :TestParameter ),
Mean( :Median ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "stat" ),
Link to original data table( 0 ),
output table name( "MeanStats" )
);
dt << Update( With( dtMeans ), Match Columns( :TestParameter = :TestParameter ) );
dt << Delete Columns( :N Rows );
Close( dtMeans, NoSave );
);
//this makes the original graph with the reference line of the first row in column :Mean
gb = dt << Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
Dispatch(
{},
"Graph Builder",
FrameBox( N Items( testStateFiltered ) ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Line Style( "dashed" );
Pen Size( 0.25 );
Y Function( Eval( :Mean[1] ), x );
)}
),
Local Data Filter( Conditional, Add Filter( columns( :TestStage ), Where( :TestStage == 1 ) ) )//no {} around the 1 here.
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
getTestStage = Function( {this}, //print (this);
testStateFiltered = Associative Array( :TestStage[ldf << get filtered rows] ) << get keys;
//this finds which row to grab the mean from
mrows = dt << Get Rows where( :TestStage == testStateFiltered[1] );
//this defines the mean to Eval() in the Y Function()
gbmean = :Mean[mrows[1]];
If( N Items( testStateFiltered ) == 1, //only does this if only one data filter is selected
gbreport = gb << Report; //makes a report reference for the graph builder
fb = gbreport[GraphBuilderComponentBox( 17 )];//accesses the frame to remove the script from
fb << Remove Graphics Script( 1 );//removes most recent script from the frame
);
gb << SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox( N Items( testStateFiltered ) ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Line Style( "dashed" );
Pen Size( 0.25 );
Y Function( Eval( GBMean ), x );
)}
)
);
Show( N Items( testStateFiltered ) );
Print( testStateFiltered );
);
rs = ldf << Make Filter Change Handler( getTestStage() );
Spero che questo ti aiuti!,
DS
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?la prima volta puoi correre getTestStage(1) manualmente.
Tieni presente che con il filtro dati ci sono 1-3 FrameBox nel GraphBuilder (la maggior parte delle volte, solo 1?). Quindi o determini a quale FB inviare il messaggio o selezioni semplicemente un TestStage e invii sempre il comando al Framebox 1.
Ri: Come (1) modificare il colore predefinito in AxisBox e (2) aggiungere la linea di riferimento in una sola variabile dell'asse Y nei grafici Y raggruppati?@SDF1 @hogi
La tabella dati che ho condiviso è stata messa insieme rapidamente come esempio. Avrei dovuto menzionare che non posso utilizzare LSL/USL o qualsiasi altro numero in questa tabella per generare la linea di riferimento.
In ogni caso, quanto segue ha funzionato per me.
- Chiamando getTestStage(1) prima della chiamata al gestore della modifica del filtro.
- Aggiunta di RemoveGraphicsScript (N) con gli handle appropriati all'interno della funzione getTestStage dove N è il numero FrameBox ottenuto dall'ultimo numero Framebox TestStage selezionato generato quando il filtro TestStage viene modificato.
Mi accontenterò di questo adesso. Tuttavia, c’è un problema rimanente. Se selezioni un TestStage, poi un secondo e poi un terzo, tutto funziona come previsto, ma se torno da 3 selezioni a una, il mio script non funziona come previsto.
Quando ne avrò la possibilità, pubblicherò un set di dati rappresentativo con lo script che spiega il problema.