Invia a grafici impilati generati dinamicamenteCiao a tutti,
Provo a generare un rapporto in cui ho 2 grafici per "parametro" per median e stdev e sto lottando per aggiungere righe al suo interno.
Il file "Summary.jmp" contiene più colonne con un "Lot" (lo uso come asse X), e quindi diversi parametri, ognuno dei quali ha una colonna per mediana con suffisso "_Q50" e una con suffisso "_StdDev" .
Ho un elenco di parametri che hanno in aggiunta Target, LowerSpecsLimit e UpperSpecsLimits (TGT, LSL, USL). Non li ho direttamente nelle colonne in quanto possono cambiare in base al set "Lot" che seleziono e in realtà preferirei non toccare affatto il file, per assicurarmi di non lasciare un pasticcio se lo script fallisce per qualsiasi ragione.
Ho anche Dispatch per sostituire i titoli e le etichette degli assi.
Ho quindi una funzione che genera i grafici mediana e stdev uno sopra l'altro, i grafici vanno bene.
Ma indipendentemente da ciò che ho inserito nella sezione di spedizione, ottengo un errore
"Impossibile trovare ScaleBox... in {}"
e tutta la spedizione di TextEditor sembra non fare nulla (nemmeno un errore, ma presumo che la funzione si fermi al primo errore di spedizione?)
Ho generato i grafici e apportato modifiche manuali per controllare lo script risultante, ma non ha aiutato. Usa direttamente "Param1_Q50" e anche quello non funziona quando lo reinserisco nello script!
Ecco il codice:
NamesDefaultToHere(1);
Open("Summary.jmp");
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {
{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}
};
ParamGraph = Function (
{parameter, title, tgt=".", lsl=".", usl="."},
LOCAL(
{Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
gb = Graph Builder(
Size(GraphXSize,GraphYSize),
Show Control Panel(0),
Show Footer(0),
Show Legend(0),
Variables(
X(:Name("Lot")),
Y(Column(medianCol)),
Y(Column(stdevCol)),
Color(:Lot)
),
Elements(
Points(X, Y, Legend(6))
),
SendToReport(
Dispatch(
{},
medianCol,
ScaleBox,
{IF(tgt != ".", Add Ref Line(tgt, "Solid", "Black", "TARGET", 1)),
IF(lsl != ".", Add Ref Line(lsl, "Solid", "Purple", "LSL", 1)),
IF(usl != ".", Add Ref Line(usl, "Solid", "Red", "USL", 1))}
),
Dispatch({}, "graph title", TextEditor, {Set Text(title)}),
Dispatch({}, "Y title", TextEditor, {Set Text("Median")}),
Dispatch({}, "Y 1 title", TextEditor, {Set Text("Std Dev")})
),
);
);
);
New Window("Summary - Report",
For(i=1, i<=Length(ParamsList), i++,
ParamGraph(ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5])
)
) << Set Window Icon("Trellis")
Ho anche provato a sostituire medianCol nella sezione Dispatch con "Param1_Q50", per vedere se si trattava di un problema di sostituzione, aspettandomi che il primo grafico ricevesse le linee e non gli altri, ma... non ha funzionato!
Ho anche provato a fare riferimento al rapporto
rgb = gb << report;
rgb[TextEditBox(5)] << Set Text("Median");
Ma ricevo di nuovo un messaggio di errore:
Cannot subscript Display Box in access or evaluation of 'Subscript' , rgb[/*###*/"TextEditor"]
Qualcuno sa come posso affrontare gli elementi di questi grafici??
Grazie in anticipo!!
Re: Invio a grafici impilati generati dinamicamente
Re: Invio a grafici impilati generati dinamicamenteCiao Jim,
Infatti funziona!
Ho copiato manualmente le tue modifiche e ho commesso 2 errori:
1. Non mi ero reso conto che le righe "Element" fossero obbligatorie
2. Ho scritto "Analizza(titolo)" invece del titolo
E preferisco di gran lunga la tua soluzione (codice più pulito e nessun "residus").
Grazie mille!
Re: Invio a grafici impilati generati dinamicamenteHo eseguito il mio script con la tabella di riepilogo in JMP 12.2 ed è stato eseguito senza errori. Di seguito è riportato lo script che include la tabella di riepilogo e il mio script rielaborato
Names Default To Here( 1 );
//Open("Summary.jmp");
dtsumm = New Table( "Summary",
Add Rows( 6 ),
New Column( "Lot",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5, 6] )
),
New Column( "Param1_Q50",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [-3, 7, 8, -12, 5, 0] )
),
New Column( "Param1_StdDev",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0.2, 1, 0.6, 2, 0.2, 0.3] )
),
New Column( "Param2_Q50",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [23, 18, 54, 62, 78, 45] )
),
New Column( "Param2_StdDev",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0.9, 1.2, 7, 3.6, 4.2, 1] )
)
);
// Run the script
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}};
ParamGraph = Function( {parameter, title, tgt = ., lsl = ., usl = .},
Local( {Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
Eval(
Substitute(
Expr(
gb = dtSumm << Graph Builder(
Size( __GraphXSize__, __GraphYSize__ ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Footer( 0 ),
Variables( X( :lot ), Y( __Q50__ ), Y( __Std__ ), Color( :lot ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( __title__ )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Median" )} ),
Dispatch( {}, "Y 1 title", TextEditBox, {Set Text( "Std Dev" )} )
)
)
),
Expr( __GraphXSize__ ), GraphXSize,
Expr( __GraphYSize__ ), GraphYSize,
Expr( __Q50__ ), Parse( MedianCol ),
Expr( __Std__ ), Parse( stdevCol ),
Expr( __Title__ ), title
)
);
If( Is Missing( tgt ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( tgt, "Solid", Black, "TARGET", 1 )
);
If( Is Missing( lsl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( lsl, "Solid", Purple, "LSL", 1 )
);
If( Is Missing( usl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( usl, "Solid", Red, "USL", 1 )
);
)
);
New Window( "Summary - Report",
For( i = 1, i <= Length( ParamsList ), i++,
ParamGraph( ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5] )
)
) << Set Window Icon( "Trellis" );Re: Invio a grafici impilati generati dinamicamenteCiao Jim,
L'ho provato sul mio file summary.jmp di riferimento e...
Cannot find TextEditBox[ "graph title" ] at {}
Cannot find TextEditBox[ "Y title" ] at {}
Cannot find TextEditBox[ "Y 1 title" ] at {}
Cannot subscript Display Box in access or evaluation of 'Subscript' , Report( gb )[/*###*/AxisBox( 3 )]
Quindi, se questo è un bug, dovrei menzionare che sono su JMP 12.1.0 64 bit.
Ma comunque, funziona con il mio codice (sporco), quindi me ne occuperò. Avrò solo un sacco di finestre con struttura ad albero da chiudere...
Re: Invio a grafici impilati generati dinamicamentePenso che troverai questo esempio un modo più diretto per gestire ciò che desideri
Non sono sicuro che il formato finale sia esattamente corretto, ma credo che tu possa facilmente modificarlo per soddisfare le tue esigenze
Names Default To Here( 1 );
//Open("Summary.jmp");
// Create a Sample data table
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
dt:npn1 << delete property( "spec limits" );
dt:pnp1 << delete property( "spec limits" );
dt:npn1 << set name( "Param1" );
dt:pnp1 << set name( "Param2" );
dt:lot_id << set name( "lot" );
dtSumm = dt << Summary(
Group( :lot ),
Median( :Param1 ),
Std Dev( :Param1 ),
Median( :Param2 ),
Std Dev( :Param2 ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column stat" )
);
dtSumm:Param1 Median << set name( "Param1_Q50" );
dtSumm:Param2 Median << set name( "Param2_Q50" );
dtSumm:Param1 Std Dev << set name( "Param1_StdDev" );
dtSumm:Param2 Std Dev << set name( "Param2_StdDev" );
// Run the script
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}};
ParamGraph = Function( {parameter, title, tgt = ., lsl = ., usl = .},
Local( {Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
Eval(
Substitute(
Expr(
gb = dtSumm << Graph Builder(
Size( __GraphXSize__, __GraphYSize__ ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Footer( 0 ),
Variables( X( :lot ), Y( __Q50__ ), Y( __Std__ ), Color( :lot ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( __title__ )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Median" )} ),
Dispatch( {}, "Y 1 title", TextEditBox, {Set Text( "Std Dev" )} )
)
)
),
Expr( __GraphXSize__ ), GraphXSize,
Expr( __GraphYSize__ ), GraphYSize,
Expr( __Q50__ ), Parse( MedianCol ),
Expr( __Std__ ), Parse( stdevCol ),
Expr( __Title__ ), title
)
);
If( Is Missing( tgt ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( tgt, "Solid", Black, "TARGET", 1 )
);
If( Is Missing( lsl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( lsl, "Solid", Purple, "LSL", 1 )
);
If( Is Missing( usl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( usl, "Solid", Red, "USL", 1 )
);
)
);
New Window( "Summary - Report",
For( i = 1, i <= Length( ParamsList ), i++,
ParamGraph( ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5] )
)
) << Set Window Icon( "Trellis" );
Re: Invio a grafici impilati generati dinamicamenteDopo molti tentativi e fallimenti, sono riuscito a farlo (non molto intuitivo!)
Quindi, non ho usato SendToReport, ma ho usato l'indicizzazione.
Se ce l'ho all'interno della funzione, non funziona. dovevo toglierlo:
NamesDefaultToHere(1);
Open("Summary.jmp");
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {
{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}
};
ParamGraph = Function (
{parameter, title, tgt=., lsl=., usl=.},
LOCAL(
{Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
return = Graph Builder(
Size(GraphXSize,GraphYSize),
Show Control Panel(0),
Show Footer(0),
Show Legend(0),
Variables(
X(:Name("Lot")),
Y(Column(medianCol)),
Y(Column(stdevCol)),
Color(:Lot)
),
Elements(
Points(X, Y, Legend(6))
)
);
);
);
wind = New Window("Summary - Report",
For(i=1, i<=Length(ParamsList), i++,
gb= ParamGraph(ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5]);
rgb = gb << report;
rgb << showtreestructure;
IF(
IsMissing(ParamsList[i][3]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][3], "Solid", "Black", "TARGET", 1);
);
IF(
IsMissing(ParamsList[i][4]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][4], "Solid", "Purple", "LSL", 1);
);
IF(
IsMissing(ParamsList[i][5]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][5], "Solid", "Red", "USL", 1);
);
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(1)] << Set Text(ParamsList[i][2]);
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(3)] << Set Text ("Median");
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(4)] << Set Text ("Standard Deviation");
)
) << Set Window Icon("Trellis");
Nota anche la riga:
rgb << showtreestructure;
Se non ce l'ho non funziona!
E questo è abbastanza fastidioso poiché non so come chiuderlo automaticamente dopo, ma almeno ora funziona!
Re: Invio a grafici impilati generati dinamicamenteCiao Jim,
Grazie! Ho fatto la correzione, ma non ha risolto il mio problema.
Impossibile trovare ScaleBox["medianCol"] in {}
o se lo codifico:
Impossibile trovare ScaleBox["Param1_Q50"] in {}
Nota che se rimuovo il secondo grafico dell'asse Y, all'improvviso le linee di riferimento funzionano, ma non i titoli e la ridenominazione degli assi.
Re: Invio a grafici impilati generati dinamicamenteGrazie, sembra che Jim ti abbia coperto
Re: Invio a grafici impilati generati dinamicamenteCiao David,
Ecco un sommario.jmp.
Re: Invio a grafici impilati generati dinamicamenteHai una mancata corrispondenza nei tipi di dati per i tuoi limiti. "Aggiungi riga di riferimento" richiede che il valore della riga (primo valore) sia un valore numerico. Nella tua funzione, lo stai impostando su una stringa di caratteri.
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ".", usl = "."}
e nella tua dichiarazione If
If( tgt != ".",
L'elenco degli elementi deve essere modificato in numerico
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ., usl = .}
e l'istruzione If deve essere modificata in:
If( IsMissing(tgt) == 0,
Re: Invio a grafici impilati generati dinamicamenteSarebbe molto più semplice aiutarti se ci fornissi un codice che possiamo eseguire. Ciò significa fornire la tabella 'summary.jmp' o riscrivere il codice per funzionare con una delle tabelle di dati di esempio fornite con JMP.