¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola,
¿Cómo puedo dibujar los límites de especificación (línea roja) por categoría de datos en un gráfico de variabilidad como el siguiente ejemplo? La línea roja se creó manualmente en PowerPoint.
Adjunto los datos del archivo jmp como referencia. Gracias por su respuesta.

Automatización y scriptingAnálisis y modelado de datos básicosVentanasRe: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?¿ Variar los límites de especificación por categoría de datos en el gráfico de variabilidad brinda algunas ideas?
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola jthi,
Revisé y seguí los pasos, pero todavía no funcionó, incluso usé directamente el archivo adjunto y el script.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Usando sus datos (+ agregando límites) y haciendo pequeñas correcciones al script de ese hilo

Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola jthi,
De hecho, dibujaste el gráfico que quería, pero aún no sé cómo modificar el script. En fin, gracias por tu respuesta.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Names Default To Here(1);
dt1 = Open("$DOWNLOADS/sample data.jmp");
dt = dt1 << Stack( // stack to get proper data format
columns(:A10, :A20, :A30),
Source Label Column("SampleGroup"),
Output Table("Stack")
);
// Add limits as they were not provided
dt << New Column("LSL", Numeric, Continuous, Values([10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20]));
dt << New Column("Target", Numeric, Continuous, Values([20, 20, 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40, 40, 40]));
dt << New Column("USL", Numeric, Continuous, Values([30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50, 50, 50]));
var = dt << Variability Chart(Y(:Data), X(:Phase, :SampleGroup));
dt_summary = dt << Summary(
Group(:Phase),
Max(:LSL),
Mean(:Target),
Min(:USL),
N Categories(:SampleGroup),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
// We need access to the framebox
fb = Report(var)[Outline Box("Variability Chart for Data"), Frame Box(1)];
//Get phases count (this was missing)
Summarize(dt, phases = By(:Phase));
// Using graphic scripts most likely easiest option
xidx = 0;
For(i = 1, i <= N Items(phases), i++,
curphase = dt_summary[i, "Phase"];
curlsl = dt_summary[i, "LSL"];
curusl = dt_summary[i, "USL"];
curtarget = dt_summary[i, "Target"];
curcount = dt_summary[i, "SampleGroup"];
xend = xidx + curcount;
lslstart = Eval List({xidx, curlsl});
lslend = Eval List({xend, curlsl});
uslstart = Eval List({xidx, curusl});
uslend = Eval List({xend, curusl});
targetstart = Eval List({xidx, curtarget});
targetend = Eval List({xend, curtarget});
xidx = xend;
Eval(EvalExpr(
fb << Add Graphics Script(
Pen Color("Red");
Pen Size(1);
Line(Expr(lslstart), Expr(lslend)); // {x1, y1}, {x2, y2}
Line(Expr(uslstart), Expr(uslend)); // {x1, y1}, {x2, y2}
Pen Color("Blue");
Line(Expr(targetstart), Expr(targetend)); // {x1, y1}, {x2, y2}
);
));
);
fb << Y Axis(Max(1.1*Max(Col Max(Column(dt, "Data")), Col Max(Column(dt_summary, "USL"))))); // adjust yaxisRe: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola,
Gracias por tu script, funcionó exitosamente.
Respecto a la configuración del límite a continuación, si tengo hasta 100 datos y solo añado la línea de límite en la fase dedicada, ¿hay alguna solución para optimizar el siguiente script? Gracias.
// Add limits as they were not provided
dt << New Column("LSL", Numeric, Continuous, Values([10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20]));
dt << New Column("Target", Numeric, Continuous, Values([20, 20, 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40, 40, 40]));
dt << New Column("USL", Numeric, Continuous, Values([30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50, 50, 50]));Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Podrías crear una tabla de límites de especificaciones o, si no tienes demasiados parámetros, una matriz asociativa para ello.
Names Default To Here(1);
dt1 = Open("$DOWNLOADS/sample data.jmp");
dt = dt1 << Stack( // stack to get proper data format
columns(:A10, :A20, :A30),
Source Label Column("SampleGroup"),
Output Table("Stack")
);
aa_specs = [
"L1" => ["LSL" => 10, "USL" => 30, "Target" => 20],
"L2" => ["LSL" => 30, "USL" => 50, "Target" => 40]
];
// Add limits as they were not provided
dt << New Column("LSL", Numeric, Continuous);
dt << New Column("Target", Numeric, Continuous);
dt << New Column("USL", Numeric, Continuous);
For Each Row(dt,
:LSL = aa_specs[:Phase]["LSL"];
:USL = aa_specs[:Phase]["USL"];
:Target = aa_specs[:Phase]["Target"];
);
O usando la tabla de especificaciones
Names Default To Here(1);
dt1 = Open("$DOWNLOADS/sample data.jmp");
dt = dt1 << Stack( // stack to get proper data format
columns(:A10, :A20, :A30),
Source Label Column("SampleGroup"),
Output Table("Stack")
);
dt_specs = New Table("Specs",
Add Rows(2),
Compress File When Saved(1),
New Column("Variable", Character, "Nominal", Set Values({"L1", "L2"})),
New Column("LSL", Numeric, "Continuous", Format("Best", 12), Set Values([10, 30])),
New Column("Target", Numeric, "Continuous", Format("Best", 12), Set Values([20, 40])),
New Column("USL", Numeric, "Continuous", Format("Best", 12), Set Values([30, 50]))
);
dt << Update(
With(dt_specs),
Match Columns(:Phase = :Variable)
);
Close(dt_specs, no save);Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola,
Funcionó cuando utilicé el método 1.
Suponiendo que quiero que L2 no tenga USL/LSL, ¿cómo puedo optimizarlo?
Intenté establecer el valor= 0, pero se mostrará una línea roja en la posición Y-cero.
I put //"L2" => ["LSL" => 0, "USL" => 0, //"Target" => 40], it's not work.
aa_specs = [
"L1" => ["LSL" => 10, "USL" => 30, "Target" => 20],
"L2" => ["LSL" => 0, "USL" => 0, //"Target" => 40]
];
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Establecería el valor como faltante si no desea tenerlo y creo que debería funcionar con el script.
Ver más...
Names Default To Here(1);
dt1 = Open("$DOWNLOADS/sample data.jmp");
dt = dt1 << Stack( // stack to get proper data format
columns(:A10, :A20, :A30),
Source Label Column("SampleGroup"),
Output Table("Stack")
);
aa_specs = [
"L1" => ["LSL" => 10, "USL" => 30, "Target" => 20],
"L2" => ["LSL" => 30, "USL" => ., "Target" => .]
];
// Add limits as they were not provided
dt << New Column("LSL", Numeric, Continuous);
dt << New Column("Target", Numeric, Continuous);
dt << New Column("USL", Numeric, Continuous);
For Each Row(dt,
:LSL = aa_specs[:Phase]["LSL"];
:USL = aa_specs[:Phase]["USL"];
:Target = aa_specs[:Phase]["Target"];
);
var = dt << Variability Chart(Y(:Data), X(:Phase, :SampleGroup));
dt_summary = dt << Summary(
Group(:Phase),
Max(:LSL),
Mean(:Target),
Min(:USL),
N Categories(:SampleGroup),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
// We need access to the framebox
fb = Report(var)[Outline Box("Variability Chart for Data"), Frame Box(1)];
//Get phases count (this was missing)
Summarize(dt, phases = By(:Phase));
// Using graphic scripts most likely easiest option
xidx = 0;
For(i = 1, i <= N Items(phases), i++,
curphase = dt_summary[i, "Phase"];
curlsl = dt_summary[i, "LSL"];
curusl = dt_summary[i, "USL"];
curtarget = dt_summary[i, "Target"];
curcount = dt_summary[i, "SampleGroup"];
xend = xidx + curcount;
lslstart = Eval List({xidx, curlsl});
lslend = Eval List({xend, curlsl});
uslstart = Eval List({xidx, curusl});
uslend = Eval List({xend, curusl});
targetstart = Eval List({xidx, curtarget});
targetend = Eval List({xend, curtarget});
xidx = xend;
Eval(EvalExpr(
fb << Add Graphics Script(
Pen Color("Red");
Pen Size(1);
Line(Expr(lslstart), Expr(lslend)); // {x1, y1}, {x2, y2}
Line(Expr(uslstart), Expr(uslend)); // {x1, y1}, {x2, y2}
Pen Color("Blue");
Line(Expr(targetstart), Expr(targetend)); // {x1, y1}, {x2, y2}
);
));
);
fb << Y Axis(Max(1.1*Max(Col Max(Column(dt, "Data")), Col Max(Column(dt_summary, "USL"))))); // adjust yaxis
También puedes modificar ligeramente el script y asegurarte de que ignore aquellos que tengan valores faltantes, pero puede que no sea necesario.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola Jarmo,
Intento cambiar a Graph Box desde la línea, pero no funciona con el script modificado a continuación. ¿Cómo podría modificarlo?
Eval(EvalExpr(
fb << Add Graphics Script(
Fill Color("Green");
Transparency( 0.3 );
Graph Box(Expr(lslstart), Expr(lslend)); // {x1, y1}, {x2, y2}
Graph Box(Expr(uslstart), Expr(uslend)); // {x1, y1}, {x2, y2}Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?¿Existe algún motivo específico para intentar modificar Graph Box dentro del Graphic Script?
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola Jarmo,
Cuando hay varios conjuntos de fases/grupos en el eje X, esta línea puede ocultar los puntos de datos del diagrama de caja. En su lugar, me gustaría usar la siguiente imagen.

Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Entonces podrías usar Rect en lugar de Line(), sin necesidad de un cuadro gráfico (el cuadro gráfico ya está incluido). Si eliges esta opción, tendrás que gestionar los valores faltantes de alguna manera, ya que la falta de puntos causará problemas con Rect().

Eval(EvalExpr(
fb << Add Graphics Script(
Transparency(0.2);
Pen Color("Green");
Fill Color("Green");
Rect(Expr(lslstart), Expr(uslend), 1);
);
));Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola Jarmo,
Gracias por su pronta respuesta.
Una pregunta más para agregar valor adicional al eje X.
Al ingresar otro valor de X (Muestra A), modifiqué el script a continuación. Sin embargo, el resultado de la línea de límite es incorrecto. ¿Cómo puedo modificarlo?
var = dt << Variability Chart(Y(:Data), X(:Phase, :SampleGroup, :SampleA));
dt_summary = dt << Summary(
Group(:Phase),
Max(:LSL),
Mean(:Target),
Min(:USL),
N Categories(:SampleGroup, :SampleA),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
// We need access to the framebox
fb = Report(var)[Outline Box("Variability Chart for Data"), Frame Box(1)];
//Get phases count (this was missing)
Summarize(dt, phases = By(:Phase));
// Using graphic scripts most likely easiest option
xidx = 0;
For(i = 1, i <= N Items(phases), i++,
curphase = dt_summary[i, "Phase"];
curlsl = dt_summary[i, "LSL"];
curusl = dt_summary[i, "USL"];
curtarget = dt_summary[i, "Target"];
curcount = dt_summary[i, "SampleGroup", "SampleA"];
xend = xidx + curcount;
lslstart = Eval List({xidx, curlsl});
lslend = Eval List({xend, curlsl});
uslstart = Eval List({xidx, curusl});
uslend = Eval List({xend, curusl});
targetstart = Eval List({xidx, curtarget});
targetend = Eval List({xend, curtarget});
xidx = xend;
Eval(EvalExpr(
fb << Add Graphics Script(
Pen Color("Red");
Pen Size(1);
Line(Expr(lslstart), Expr(lslend)); // {x1, y1}, {x2, y2}
Line(Expr(uslstart), Expr(uslend)); // {x1, y1}, {x2, y2}
Pen Color("Blue");
Line(Expr(targetstart), Expr(targetend)); // {x1, y1}, {x2, y2}
);
));
);
fb << Y Axis(Max(1.1*Max(Col Max(Column(dt, "Data")), Col Max(Column(dt_summary, "USL"))))); // adjust yaxisRe: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?¿Cómo se forman los límites (según qué grupos)? ¿Qué falla? Probablemente tengas que ajustar el Resumen, posiblemente el Resumen y el valor de conteo actual.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Sí, me di cuenta, así que modifiqué el script para resumir y el valor de conteo. Sin embargo, la línea de límite no puede cubrir completamente todas las condiciones de la fase. Los límites siguen basándose en la fase. (Ignore que no hay un nuevo eje X de SampleA).

Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Podrías crear una nueva columna en tu tabla principal que combine SampleGroup y SampleA, por ejemplo, concatenándolos. Luego, úsala para las N categorías del resumen y para el recuento actual para obtener los recuentos correctos.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?var = dt << Variability Chart(Y(:Data), X(:Phase, :SampleGroup, :SampleA));
dt_summary = dt << Summary(
Group(:Phase),
Max(:LSL),
Mean(:Target),
Min(:USL),
N Categories(:SampleGroup, :SampleA),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
// We need access to the framebox
fb = Report(var)[Outline Box("Variability Chart for Data"), Frame Box(1)];
//Get phases count (this was missing)
Summarize(dt, phases = By(:Phase));
// Using graphic scripts most likely easiest option
xidx = 0;
For(i = 1, i <= N Items(phases), i++,
curphase = dt_summary[i, "Phase"];
curlsl = dt_summary[i, "LSL"];
curusl = dt_summary[i, "USL"];
curtarget = dt_summary[i, "Target"];
curcount = dt_summary[i, "N Rows"];
Modifiqué el script anterior, pero no se puede generar la línea de límite. ¿Cómo puedo modificarla?
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?¿Qué sucede (no tengo tus datos así que no puedo comprobarlo)?
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Consulte los archivos adjuntos para obtener datos de prueba y el script.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Como mencioné antes, la opción más sencilla es crear una nueva columna de agrupación y usarla en la tabla de resumen. También podría bastar con obtener la suma de las n categorías de varios grupos.
curcount = Sum(dt_summary[i, {"Leg", "Layer"}]);Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola,
Si busca una solución sin scripts y está cómodo con el uso de Graph Builder, en realidad maneja límites de especificaciones de múltiples niveles por categoría; solo asegúrese de que sus límites de especificaciones estén estructurados en consecuencia (por ejemplo, a través de la propiedad de la columna).
Si desea conservar el Gráfico de Variabilidad, este comportamiento no está integrado en el núcleo de JMP, pero es compatible con YieldOptiX, un complemento desarrollado para el análisis de datos de prueba. Este complemento añade compatibilidad con límites de especificación basados en categorías directamente en el Gráfico de Variabilidad.
Por lo tanto, ambas opciones (Generador de gráficos o Gráfico de variabilidad con límites agrupados) son compatibles según su interfaz preferida; solo depende de lo que se adapte mejor a su proceso.
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Hola Jarmo
Al ingresar varios datos, el límite de especificación no se ajusta al contenido del script. ¿Cómo puedo modificarlo?
Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Debe calcular el número de grupos de diferentes maneras. Una opción bastante sencilla podría ser agregar una nueva columna a su dt que combine pierna y capa.
dt << new column("LEGLAYER", Character, Nominal, Formula(:Leg ||:Layer));
Luego usa eso en el resumen
dt_summary = dt << Summary(
Group(:SampleGroup),
Max(:LSL),
//Mean(:Target),
Min(:USL),
N Categories(:LEGLAYER),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
y obtener el recuento de eso
curcount = Sum(dt_summary[i, {"LEGLAYER"}]);

Re: ¿Cómo defino los límites de especificación por categoría de datos en el gráfico de variabilidad?Utilicé el script que compartiste, pero no se muestra el límite de especificaciones.
Por favor ayuda a revisar el script como adjunto, ¿cómo modificarlo?