Utilice la lista de variables de columnas como eje Y en Graph BuilderAmigos,
Acabo de actualizar de JMP14 Pro a JMP15 Pro y tengo problemas con muchos de mis scripts JSL que usan OverlayPlots.Estoy tratando de convertir algunos de mis OP más complejos a GB y tengo problemas al usar listas de variables en GB.Con OP, el siguiente código trazó con éxito todas las variables para un archivo de datos determinado que cumplió con los criterios Y (Lista de evaluación (????)).Creé este código para tener en cuenta el hecho de que varios sitios de campo pueden tener una cantidad diferente de sensores presentes que quiero trazar.
// Potential Tair Data
pot_tair_list = {"Datalogger Internal Temperature (C)", "Air Temperature - HMP - 5m (C)", "Air Temperature - HMP (C)",
"Air Temperature, STD - HMP (C)", "Air Temperature - WXT (C)", "Air Temperature @ 5m - HMP (C)", "Air Temperature - MA4100 (C)",
"Air Temperature - EE181 (C)", "Air Temperature - WS700 (C)", "Air Temperature - GMX541 (C)"};
// Create empty list to hold names of the those measurement variables found in data table
act_tair_list = {};
// Run through data table column names and put those that match measurement variable list into new list
For( i = 1, i <= N Items( pot_tair_list ), i++,
If( Contains( dt_col_name_list, pot_tair_list[i] ),
Insert Into( act_tair_list, pot_tair_list[i] )
)
);
******************************
// Plot Air Temperature data
If( N Items( act_tair_list ) > 0,
Graph Builder(
Size( 1600, 500 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Legend Position( "Right" ),
Fit to Window( "Off" ),
Graph Spacing( 3 ),
Variables( X( :Name( "Date & Time" ) ), Y( Eval List( act_tair_list ) ) ),
Elements( Line( X, Y, Legend( 4 ) ), Points( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
"Date & Time",
ScaleBox,
{Format( "m/d/y", 10 ), Min( sdate ), Max( edate ), Interval( "Day" ), Inc( 28 ), Minor Ticks( 0 )}
),
Dispatch(
{},
Y( Eval List( act_tair_list ) ),
ScaleBox,
{Format( "Fixed Dec", 10, 0 ), Inc ( 5 ), Show Major Grid( 1 ), Minor Ticks( 0 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model( 1, Properties( 0, {Line Color( 3 ), Fill Color( 0 )}, Item ID( "Battery (V)", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 1 )} )
)
)
);
A GB no le gusta la misma construcción de lista que he usado con los OP y arroja el siguiente error:
La columna especificada no se encuentra en la tabla de datos.{191471} en el acceso o la evaluación de 'Y' , Y( Eval List( act_tair_list ) ) /*###*/Excepción en el inicio de la plataforma{191471} en el acceso o la evaluación de 'Graph Builder '
Completé la mayor parte de mis gráficos JSL utilizando la plataforma OP y no sé cómo resolver este problema.
¿Es posible pasar una lista de variables a GB para el eje Y y, de ser así, cómo se ve ese formato? Agradecería cualquier ayuda para resolver este problema para poder continuar usando un único script gráfico para todas las variables en todos los sitios de campo, independientemente de los sensores específicos reales presentes.Gracias.
Re: Usar lista de variables de columnas como eje Y en Graph BuilderNames Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
var expr = Expr( Variables( X( :Weight ) ) );
For( c = 1, c <= N Items( col ), c++,
y expr = Expr( Y( Position( 1 ) ) );
Insert Into( y expr, col[c], 1 );
Insert Into( var expr, Name Expr( y expr) );
);
Eval(
Substitute(
Expr(
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
vvv,
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
),
Expr( vvv ),
Name Expr( var expr )
)
);Re: Usar lista de variables de columnas como eje Y en Graph BuilderLa idea es sencilla. Substitute() busca una expresión dentro de otra expresión, por lo que puse una expresión inusual, vvv, dentro de la expresión principal para que sea el objetivo inequívoco. La función lo reemplaza con la expresión que creé para las columnas en el rol Y.
No sé a qué te refieres con " llamando a la lista de variables real al final de la instrucción GB. " No estoy haciendo tal cosa. Supongo a qué te estás refiriendo, solo puedo decir que estás confundido acerca de la diferencia entre el código que se ejecuta y las expresiones. Además, los argumentos con nombre en una llamada a función o envío de mensaje son independientes de la posición.
Puede resultarle instructivo seleccionar la expresión Eval() y ejecutar este código por sí solo. Genera una nueva expresión que se evalúa.
Este caso es una aplicación simple de expresiones. Debería estudiar la Guía de secuencias de comandos JMP o asistir a una de nuestras clases sobre cómo introducir las secuencias de comandos.
Re: Usar lista de variables de columnas como eje Y en Graph BuilderMarca,
La otra cosa acerca de su solución es que traza cada variable en un panel separado en lugar de todas en el mismo panel, que es en última instancia lo que quiero.El siguiente código ilustra lo que quiero producir.Probé diferentes modificaciones de su código pero fue en vano.¿Le importaría darme una sugerencia sobre cómo puedo lograr esto?Gracias.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
Graph Builder(
Fit to Window( "Off" ),
Graph Spacing( 3 ),
Variables(
X( :Weight ),
Y( :Runtime ),
Y( :RunPulse, Position( 1 ) ),
Y( :RstPulse, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Line( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "Runtime", 1 ) ),
Base( 1, 0, 0, Item ID( "RunPulse", 1 ) ),
Base( 2, 0, 0, Item ID( "RstPulse", 1 ) )
)}
),
Dispatch(
{},
"400",
LegendBox,
{Legend Position( {3, [-1, -1, -1], 6, [0, 1, 2]} ),
Position( {-1, -1, -1, 0, 1, 2} )}
)
)
);
Re: Usar lista de variables de columnas como eje Y en Graph BuilderGracias Mark por la sugerencia tan útil.
¿Puedes explicar por qué necesitas usar lo que parece un marcador de posición, vvv, en lugar de llamar a Name Expr ( var expr ) en esta ubicación?Veo que no se produce ningún gráfico cuando hago esto, pero no tengo claro por qué es necesario vvv y llamar a la lista de variables real al final de la instrucción GB en lugar de donde normalmente se declaran las variables.
Re: Usar lista de variables de columnas como eje Y en Graph BuilderEl inicio de Graph Builder no funciona de la misma manera que el inicio de Overlay Plot. Overlay Plot utilizó un argumento con nombre Y() que aceptaba una referencia de columna o una lista de referencias de columna. Graph Builder se inicia con un argumento Y() separado para cada columna en esa función. A continuación se muestra un ejemplo basado en la tabla de datos de Fitness:
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables(
X( :Weight ),
Y( :Runtime ),
Y( :RunPulse, Position( 1 ) ),
Y( :RstPulse, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
Un enfoque es utilizar expresiones. Las funciones Insert Into() y Substitute() facilitan la creación de la expresión de inicio necesaria.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
var expr = Expr( Variables( X( :Weight ) ) );
For( c = 1, c <= N Items( col ), c++,
y expr = Expr( Y() );
Insert Into( y expr, col[c] );
Insert Into( var expr, Name Expr( y expr) );
);
Eval(
Substitute(
Expr(
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
vvv,
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
),
Expr( vvv ),
Name Expr( var expr )
)
);Re: Usar lista de variables de columnas como eje Y en el generador de gráficosGracias por la excelente explicación. Estoy tratando de enseñarle el Sustituto a los empleados que comienzan a usar scripts. Noté que este ejemplo está codificado de forma rígida para los 3 gráficos en esta sección a continuación. Si agrega una cuarta columna a la lista (como col = {:Runtime, :RunPulse, :RstPulse, :MaxPulse}), aún traza 3 gráficos en Graph Builder
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
¿Existe una forma sencilla de configurar estas expresiones también en el bucle For? No estoy muy seguro de si la nueva expresión debe comenzar con Elements() o se puede hacer ensamblando una expresión Points() y una expresión Smoother(), similar a la "var expr". Voy a jugar con esto, pero quería saber si hay algún otro truco sobre lo que Substitute podría ver como una expresión, o en qué nivel de la expresión se recomienda comenzar. Por ejemplo, comenzaste la var expr con "Variables (X (:Weight)) y luego insertaste las Y. ¿Es esta una buena práctica?