Reemplazar 'Bivariado' por 'Constructor de gráficos' en un 'Grupo de ajuste'¡Hola comunidad!
Durante años tuve un script en el que dibujaba gráficos bivariados en un grupo de ajuste, como el siguiente:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
Lo clave aquí es obtener una lista de parámetros en forma de lista de cadenas y luego los gráfico uno por uno.
Ahora necesito cambiar de Bivariate Plot a Graph Builder debido a algunas características que Graph Builder tiene y Bivariate no.
Descubrí cómo hacer que el gráfico del Constructor de Gráficos se vea exactamente igual que el de Bivariate, pero no sé si hay una forma sencilla de dibujar los GB en un Grupo de Ajuste como el anterior. Parece que el Grupo de Ajuste puede aceptar GB de la siguiente manera:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
Pero para una lista arbitraria de parámetros, necesito escribirla en un bucle. Esperaba algo más sencillo como (obviamente no funciona):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
¿Hay alguna forma para que GB tome una lista de parámetros y genere una lista de DisplayBoxes?
Automatización y scriptingRe: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Estuviste bastante cerca. Necesitas crear un bucle con un script. Lo siguiente parece funcionar. Podrías reemplazar la lista de columnas con una salida GUI o, si no te sientes cómodo con los scripts GUI, incluso podrías crear un script para "obtener las columnas seleccionadas", seleccionar las columnas que se van a graficar y luego convertirlas programáticamente a la lista.
La ventaja del constructor de gráficos es su interactividad. Esto lo hace menos óptimo para tener varios gráficos en una ventana, ya que cada uno tendría que modificarse (suponiendo que así sea), pero usar scripts lo simplifica (bastante).
Un método que utilizo es usar un script que genera datos en varias plataformas, incluyendo "y by x" y "GB". Además, genera el selector de columnas. Además, hay un botón para representar gráficamente cada resultado de la lista del selector de columnas en un diario. Por supuesto, no hay interactividad.
De todos modos, aquí está el guión ligeramente modificado.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Para el Constructor de Gráficos, usarías Página para obtener un efecto similar, pero esto requiere que tus datos tengan un formato específico. O Cambiador de Columnas.
Si no puedes usar Página, te recomiendo que elimines la opción Ajustar grupo del Constructor de gráficos. Reúne los gráficos en el Cuadro de alineación para que se puedan agrupar fácilmente en filas.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
Si desea poder cambiar la cantidad de informes que hay en cada fila, puede hacerlo con el Cuadro de alineación
<< N Col(1);
Puedes agregar scripts al cuadro de esquema de nivel más alto si es necesario.
Si desea usar "Ajustar grupo", puede hacerlo, pero requiere el manejo de expresiones. También puede crear una función que lo haga automáticamente si necesita hacerlo con frecuencia.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Las restricciones que tengo son las siguientes:
Este script forma parte de un complemento. Actualmente, recibe como entrada una lista de columnas en una cadena de texto (generada mediante la interfaz gráfica de usuario).
Y no necesito interactividad, necesito un formato preciso de las tramas acordado con el cliente.
Estoy cambiando a GB porque, al parecer, Fit Y by X no tiene una forma sencilla de mostrar las barras de error. El cliente de repente quiere barras de error en el gráfico.
La pregunta es cuál es la manera más eficiente de generar una lista de GB en lugar de un solo GB. Esperaba una función no documentada que permitiera hacerlo de la misma manera que en Ajustar Grupo y Ajustar Y por X.
Pero parece que tendré que crear bucles en el script.
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Creo que tendré que cambiar a Line Up Box. No quería hacerlo porque requiere cambios de código más invasivos, pero no me gusta usar expresiones de script. Solo espero que:
1. No uso ninguna característica específica de este grupo de ajuste en ninguna otra parte del código.
2. Podré hacer que se vea exactamente como Fit Group en la salida.
Mostraré un código de ejemplo del resultado final.
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Tu script deja de funcionar tan pronto como hago esto:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
Semánticamente, no debería haber diferencia si uso la expresión del Constructor de Gráficos directamente o si tengo una variable que la represente; eso es lo que entendí. ¿Por qué falla el script?
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Una pregunta para ti.
Su script funciona perfectamente después de corregir un error tipográfico obvio:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
que luego se agrega a 'lub' sin problemas.
Reescribí el primer guión que sugeriste en una forma ligeramente diferente:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
En mi caso 'listOfGBs' también se muestra como:
{Graph Builder[], Graph Builder[]}
pero luego en línea:
lub << Append( listOfGBs );
genera error:
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
¿Alguna idea de por qué?
Intentaré jugar un poco pero me gustaría mantener GB en una función.
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Ok, funciona de esta forma:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
Puedo utilizar tanto la función (a mi manera) como la expresión (efectivamente a tu manera);
No sé cuál era el problema anterior, pero aparentemente necesito crear LineUp Box dentro de la función y devolverlo en lugar del objeto GB.
Re: Reemplazo de "Bivariado" por "Generador de gráficos" en un "Grupo de ajuste"Estás agregando una lista, no constructores de gráficos, al cuadro de alineación. Yo modificaría tu script a algo como esto.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
Hay que tener cuidado al crear los gráficos. Esto generalmente se puede evitar experimentando con expresiones, pero requerirá construirlas. Además, si no se necesitan las referencias, será un poco más fácil, ya que no se necesitará insertar en. Además, se pueden obtener más tarde con << XPath.
Ver más...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;