Hola,
Las secuencias de comandos para Graph Builder me parecen una experiencia brutal (he estado escribiendo secuencias de comandos en JMP durante algún tiempo). No parece ser intuitivo, ni parece que pueda encontrar la ayuda específica que necesito. Así que ondeé mi bandera blanca y le pregunté al grupo.
Mi secuencia de comandos toma las columnas correctas (que varían en número) y crea un Generador de gráficos con dos niveles X anidados, todo correctamente. El problema es que aunque la primera variable que doy son puntos, por alguna razón el creador de gráficos asigna diagramas de caja a todas las demás variables (lo cual no se ve por ninguna parte en mi script). Entonces, estoy buscando una manera fácil de convertir todas mis variables y en puntos. Sospecho que implica recorrer Elementos, pero que me aspen si encuentro cómo hacerlo correctamente.
¿Pensamientos? Además, ¿alguien tiene una buena referencia para secuencias de comandos detalladas para Graph Builder?
TÍA! fred
Sí. Estoy de acuerdo. Ese ha sido mi enfoque para aprenderlo también, pero es sorprendentemente frustrante en comparación con otros scripts. ¡Un área propicia para más discusiones!
Gracias por la ayuda. Tomé el siguiente enfoque (mediante iteración... ¡muchos fallos!):
1. Tengo una lista de nombres de columnas que quiero incluir en el gráfico. Está en la lista "a" (no se muestra). Es lo que me gustaría trazar.
2. Construyo una lista a partir de las columnas de la tabla de datos que coinciden con mi lista de búsqueda. Estas son las variables del eje Y que existen y que puedo trazar.
3. Construyo un generador de gráficos y configuro mi eje X con variables anidadas. Esto es común para todos mis datos.
4. Luego hago un bucle y agrego las variables.
5. Luego hago un bucle y agrego los elementos.
6. Luego hago un bucle y agrego líneas de cuadrícula. Y finalmente los títulos.
Para los pasos 4 a 6, seguía fallando JMP si intentaba hacer estas cosas dentro de un solo bucle. Así es como llegué a este punto. El guión funciona (tuve que sacar algunas cosas confidenciales menores), pero no es rápido.
Comparado con otros JSL que he programado, este es bastante complicado. Nunca he tenido tantos fallos de JMP. Pero funciona.
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Los scripts JSL de Graph Builder no son fáciles de entender.Mi enfoque es modificar el gráfico a mi gusto y luego hacer clic en el triángulo rojo y obtener el script resultante.
Sin embargo, si tiene un número dinámico de variables Y, puede obtener el script para 2 o 3 variables Y y estudiar el script GB para detectar patrones.Luego para extenderlo a norte Y variables, construiría dinámicamente una cadena que contenga el script gb para ejecutar y luego ejecutarlo con eval(parse(gb_string)).
A continuación se muestra una forma de utilizar expresiones. Me gusta este enfoque en este caso porque tengo control total y puedo crear toda la expresión de lanzamiento de una sola vez.
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
Me doy cuenta de que esta respuesta no es una solución completa. No proporcionó suficiente información para intentar una solución. Además, es mejor que aprendas a solucionarlo tú mismo. Su objetivo es ilustrar un enfoque que podría funcionar para usted.
¿Está trazando varias columnas en la función Y o está utilizando varios objetos de Graph Builder, uno para cada columna?
Bueno, encontré una pequeña solución, pero definitivamente es inestable.
He finalizado:
- haciendo el gráfico inicial con mis variables x anidadas deseadas, pero sin variables Y.
- Luego ejecuto un bucle para agregar las variables Y.
- Luego agrego otro bucle para eliminar el elemento de cada Y y agrego un nuevo elemento para cada Y que tenga puntos.
- Luego agrego otro bucle para agregar líneas de cuadrícula para cada Y.
Casi todos los pasos tienen una espera (1) entre ellos. Inicialmente probé un solo bucle para cada variable que hacía cada cosa, y fallé JMP completo alrededor de 10 veces hasta ahora. Fue mi solución de problemas lo que me llevó al formulario anterior.
Entonces funciona, pero no me gusta que JMP falle si no se codifica correctamente. Y todavía agradecería que alguien me indicara una referencia sólida para las secuencias de comandos de Graph Builder. ¡Gracias de antemano!fred