¿Cómo escribir todos los datos X e Y en un único gráfico de serie temporal en la aplicación JMP?Hola a todos,
Estoy desarrollando una aplicación JMP que utiliza la integración de Python para brindar a los usuarios de la aplicación la flexibilidad de cargar cualquier archivo de datos (Excel) con datos de procesos industriales. Esta aplicación incluye múltiples ventanas de módulos y secuencias de comandos extensas.
Una cosa que estoy tratando de hacer es simplemente trazar todos los datos de un archivo de datos cargado en un gráfico , donde la primera columna es siempre el tiempo (X) y las columnas restantes son las variables de proceso (Y). He creado un módulo con un cuadro de gráficos para mostrar esto una vez que se ejecuta la aplicación y se cargan los datos, pero tengo problemas para programar esta funcionalidad. Como no sé cuántas columnas habrá en un archivo de datos determinado, ni cómo se titulan, necesito que el script acepte automáticamente todas las Y (todas las columnas de datos excepto la primera) y las pase a través del gráfico.
Al jugar con las diferentes opciones de gráficos de JMP, no he podido obtener gráficos de series temporales para mostrar múltiples gráficos superpuestos, por lo que he estado intentando crear un script con Graph Builder. Cuando trazo manualmente los datos en Graph Builder, puedo seleccionar todas las columnas que quiero y arrastrarlas al Graph Builder Y y se muestra como quiero, con todos los datos mostrados en un gráfico. Sin embargo, cuando intento escribir esto, Graph Builder solo muestra la primera variable Y que paso a través del script.
No estoy seguro de cómo resolver este problema. ¡Cualquier consejo u otra sugerencia será muy apreciada!
¡Gracias!
-Estela
PD: Si hay otra forma de graficar estos datos de esta manera sin usar Graph Builder, hágamelo saber. Prefiero que esta aplicación solo muestre al usuario el resultado graficado y no toda la funcionalidad adicional que está disponible al usar Graph Builder.
Automatización y secuencias de comandosRe: ¿Cómo escribir todos los datos X e Y en un solo gráfico de serie temporal en la aplicación JMP?Muchas gracias por la información y los consejos útiles. ¡Realmente lo aprecio!
Re: ¿Cómo escribir todos los datos X e Y en un solo gráfico de serie temporal en la aplicación JMP?Combinando la solución yo y @txnelson proporcionado anteriormente, debería poder modificar punto/más suave y así sucesivamente. Primero cree el gráfico con JMP (no es necesario tener todas las columnas en el eje y, puede usar solo dos). Pasaré por el proceso de cómo desarrollaría este script (esto será un poco largo):
1. Abra los datos de muestra de JMP. En este caso, Semiconductor Capability.jmp, como sé, tiene muchas columnas.
2. Cree un gráfico en el generador de gráficos con alguna columna como eje X y dos como eje Y

toma el guion
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
)
3. Cambie los puntos a línea y también cambiaré la estadística de resumen del valor predeterminado, para que pueda ver cómo se puede cambiar eso en el script

tomar guión
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. Ahora tengo guiones básicos bastante buenos para empezar a trabajar en esto. Porque sé Re: ¿Puedes construir esto sin escribir expresión en una cadena? se puede usar para resolver este problema, lo uso como mi línea de base (script que proporcioné anteriormente).
Con gráfico básico:
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
);
Ahora, si quisiera tener Línea en lugar de puntos, verificaría lo que tengo que cambiar en el script de "línea" que JMP me dio anteriormente. Básicamente necesitaré agregar elementos.
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
Por suerte estos han sido añadidos en la otra publicación.
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
);

(No cambié las estadísticas de resumen, pero debería ser bastante fácil cambiarlas insertando algunas expresiones más en var_line antes de la creación del generador de gráficos)
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 />
Saber cómo usar Expr, Substitute, NameExpr, etc., lo aprendí a través de estas dos publicaciones en la comunidad. Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute , Funciones de manejo de expresiones: Parte I - Desentrañar Expr(), NameExpr(), Eval(), ... Adivinanza y con montones y montones de prueba y error (todavía me confunden con ellos, especialmente con Name Expr)
Y finalmente, si tuviera que combinar este script con el script que tiene (lo limpiaría más, cambiaría el orden de las expresiones, lo más probable es que complete los selectores de columna y tal vez brinde la opción de seleccionar qué tipo de gráfico usar, pero esto debería dar una idea):
Ver más... Re: ¿Cómo escribir todos los datos X e Y en un solo gráfico de serie temporal en la aplicación JMP?¡Gracias por la respuesta y el consejo "<
Una cosa que no veo/entiendo es cómo especificar si quiero que este gráfico use Line o Smoother and Point o posiblemente alguna otra combinación de elementos de gráfico, ya que no he decidido cuál es mejor para mi uso. ¿Hay alguna manera de agregar eso a esto?
¡Gracias!
- Estelle
Re: ¿Cómo escribir todos los datos X e Y en un solo gráfico de serie temporal en la aplicación JMP?¡Gracias por la respuesta! Intenté usar el script generado por JMP y ajustarlo, pero sigo teniendo este problema. A continuación se muestra un script en el que he estado trabajando para ver qué resultados puedo obtener:
//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>);Creo que uno de mis problemas puede ser que no estoy exactamente seguro de cómo especificar la parte de "Elementos" para aceptar cualquier número de Y. Para este script específico, no importa si agrego más Elementos (Línea (Y (1), Y (2), Y (3), etc.)) y cambio las columnas que selecciono como Y, solo obtengo una variable trazada.
¡Gracias!
- Estela
Re: ¿Cómo escribir todos los datos X e Y en un solo gráfico de serie temporal en la aplicación JMP?Suena como si estuviera generando su JSL desde cero... como lo haría un programador de Python, en lugar de tomar el Graph Builder interactivo que produjo y luego hacer que JMP genere el JSL que creará el gráfico.Si creo interactivamente el siguiente gráfico,

Al ir al triángulo rojo y seleccionar "Script", produce un script que maneja ambas variables del eje 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 ) )
)}
)
)
);
Ahora, si su problema es que cuando toma un script como el anterior y está tratando de expandirlo para manejar tantas columnas Y como necesite, eso a veces puede requerir un poco más de trabajo.
Aquí está la misma estructura de un gráfico, pero con muchas más columnas Y

Aquí está el JSL expandido que JMP produjo para recrear el gráfico
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 ) )
)}
)
)
);
Aquí es donde el programador JSL tiene que crear la cadena de comando para ejecutar y pasar a Graph Builder.Si ya está haciendo esto y solo está obteniendo la primera variable Y en el gráfico, lo que sucede normalmente es que Graph Builder no puede evaluar la información que se le pasa.Si proporciona el JSL que está utilizando, la comunidad suele ser bastante buena para ayudar.
Re: ¿Cómo escribir todos los datos X e Y en un solo gráfico de serie temporal en la aplicación JMP?Este tema puede ser útil:
Re: ¿Puedes construir esto sin escribir expresión en una cadena?
Muchas expresiones aquí, también puede usar << Obtener imagen para "eliminar funcionalidades" del generador de gráficos
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
);