Envío a gráficos apilados generados dinámicamenteHola a todos,
Intento generar un informe en el que tengo 2 gráficos por "parámetro" para la mediana y la desviación estándar, y me cuesta agregar líneas.
El archivo "Summary.jmp" contiene varias columnas con un "Lote" (lo uso como eje X) y luego varios parámetros, cada uno de ellos con una columna para la mediana con el sufijo "_Q50" y otra con el sufijo "_StdDev" .
Tengo una lista de parámetros que tienen además Target, LowerSpecsLimit y UpperSpecsLimits (TGT, LSL, USL). No los tengo directamente en las columnas, ya que pueden cambiar en función del conjunto "Lote" que seleccione y, de hecho, preferiría no tocar el archivo en absoluto, para asegurarme de no dejar un desastre si falla el script. por cualquier razón.
También tengo Dispatch para reemplazar los títulos y las etiquetas de los ejes.
Luego tengo una función que genera los gráficos de la mediana y la desviación estándar uno encima del otro, los gráficos están bien.
Pero no importa lo que ponga en la sección de envío, me sale un error
"No se puede encontrar ScaleBox... en {}"
y todo el envío de TextEditor parece no hacer nada (ni siquiera un error, pero supongo que la función se detiene en el primer error de envío).
Generé los gráficos y realicé una modificación manual para verificar el script resultante, y no sirvió de nada. Utiliza "Param1_Q50" directamente, ¡e incluso eso no funciona cuando lo vuelvo a poner en el script!
Aquí está el código:
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")
Incluso traté de reemplazar medianCol en la sección Envío con "Param1_Q50", para ver si eso era un problema de sustitución, esperando que el primer gráfico obtuviera las líneas y no los demás, pero... ¡no funcionó!
También intenté obtener una referencia al informe.
rgb = gb << report;
rgb[TextEditBox(5)] << Set Text("Median");
Pero me sale un mensaje de error de nuevo:
Cannot subscript Display Box in access or evaluation of 'Subscript' , rgb[/*###*/"TextEditor"]
¿Alguien sabe cómo puedo abordar los elementos de estos gráficos?
¡¡Gracias por adelantado!!
Re: Envío a gráficos apilados generados dinámicamente
Re: Envío a gráficos apilados generados dinámicamenteHola Jim,
De hecho, ¡funciona!
Copié manualmente tus cambios y cometí 2 errores:
1. No me di cuenta de que las líneas "Elemento" eran obligatorias
2. Escribí "Parse (título)" en lugar de título
Y prefiero mucho más su solución (código más limpio y sin "residuos").
¡Muchas gracias!
Re: Envío a gráficos apilados generados dinámicamenteEjecuté mi secuencia de comandos con su tabla de resumen en JMP 12.2 y se ejecutó sin errores. A continuación se muestra el script que incluye su tabla de resumen y mi script reelaborado
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: Envío a gráficos apilados generados dinámicamenteHola Jim,
Lo probé en mi archivo ref summary.jmp, y...
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 )]
Entonces, si esto es un error, debo mencionar que estoy en JMP 12.1.0 64 bits.
Pero de todos modos, funciona con mi código (sucio), así que me ocuparé de eso. Tendré un montón de ventanas de estructura de árbol para cerrar...
Re: Envío a gráficos apilados generados dinámicamenteCreo que encontrará en este ejemplo una forma más directa de manejar lo que desea.
No estoy seguro de que el formato final sea exactamente correcto, pero creo que puede modificarlo fácilmente para satisfacer sus necesidades.
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: Envío a gráficos apilados generados dinámicamenteDespués de muchos intentos y fallas, logré hacerlo (¡no muy intuitivo!)
Entonces, no usé SendToReport, pero usé subíndices.
Si lo tengo dentro de la función, no funciona. Tuve que sacarlo:
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");
También tenga en cuenta la línea:
rgb << showtreestructure;
¡Si no lo tengo, no funciona!
Y eso es bastante molesto ya que no sé cómo cerrarlo automáticamente después, pero al menos, ¡funciona ahora!
Re: Envío a gráficos apilados generados dinámicamenteHola Jim,
¡Gracias! Hice la corrección, pero no solucionó mi problema.
No se puede encontrar ScaleBox["medianCol"] en {}
o si lo codifico duro":
No se puede encontrar ScaleBox["Param1_Q50"] en {}
Tenga en cuenta que si elimino el segundo gráfico del eje Y, de repente las líneas de referencia funcionan, pero no el cambio de nombre de los títulos y los ejes.
Re: Envío a gráficos apilados generados dinámicamenteGracias, parece que Jim te tiene cubierto.
Re: Envío a gráficos apilados generados dinámicamenteHola David,
Aquí hay un resumen.jmp.
Re: Envío a gráficos apilados generados dinámicamenteTiene una discrepancia en los tipos de datos para sus límites. La opción "Agregar línea de referencia" requiere que el valor de la línea (primer valor) sea un valor numérico. En su función, la está configurando en una cadena de caracteres.
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ".", usl = "."}
y en su declaración If
If( tgt != ".",
La lista de elementos debe cambiarse a numérica.
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ., usl = .}
y la declaración If debe cambiarse a:
If( IsMissing(tgt) == 0,
Re: Envío a gráficos apilados generados dinámicamenteSería mucho más fácil ayudarlo si puede proporcionarnos un código que podamos ejecutar. Lo que significa proporcionar la tabla 'summary.jmp' o reescribir el código para que funcione con una de las tablas de datos de muestra que vienen con JMP.