¿Cómo vincular selecciones de gráficos con JSL?¡Hola a todos!
Estoy usando Application Builder y tengo varios gráficos diferentes que escribí usando Graph Builder. Muchos de los gráficos usan diferentes tablas de datos que se operaron con Python y se enviaron de vuelta a JMP. Debido a que los datos pasan por un procesamiento significativo en Python, estas tablas no incluyen ninguna de las mismas variables.Estoy buscando una forma de conectar las selecciones en estos gráficos (como si selecciona una de las etiquetas de leyenda y los elementos no seleccionados aparecen en gris) usando JSL.
Por ejemplo, estoy graficando mis datos sin procesar y los datos de mi "producto final", que tienen dimensiones muy reducidas y características similares se agrupan, por lo que en Table1/Graph1 puede haber 30 columnas y en Table2/Graph2 solo hay 3. Si tengo un cuadro de lista con las variables de Table2 y selecciono Variable1, me gustaría poder resaltar Variable1 en Graph2, pero también resaltar la información relevante en Graph1. Puedo determinar las columnas/filas relevantes para resaltar, pero no he podido encontrar cómo configurar realmente esas selecciones en el gráfico. También sería genial si pudiera seleccionar una de las etiquetas de la leyenda en un gráfico (donde automáticamente atenúa los elementos no seleccionados) y escribir algo para que seleccione la información relevante en los otros gráficos.
¿Hay una línea JSL para resaltar algo en un gráfico como este?
La personalización en masaRe: ¿Cómo vincular selecciones de gráficos con JSL?Los controladores de estado de fila se activan en todos los cambios de estado de fila. Entonces, cuando elige 1 fila, desencadena (al menos) dos eventos; uno deseleccionar y otro seleccionar. Lo más probable es que esto esté causando algunos problemas y podría causar fácilmente un bucle. Si solo pudiera capturar eventos específicos (seleccionar, deseleccionar, ocultar, excluir...) tal vez funcionaría.
Re: ¿Cómo vincular selecciones de gráficos con JSL?Veo... Gracias por la info! Ya que estoy cerrando este capítulo sobre los controladores de estado de fila jajaja, decidí probar la idea "<< Agregar secuencia de comandos de gráficos" proporcionada anteriormente nuevamente, pero esta vez con banderas. Cuando se implementa sin banderas, parece exhibir el mismo (mal) comportamiento con el que estaba lidiando anteriormente, pero con banderas parece funcionar!
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
Con suerte, esto seguirá funcionando a medida que amplí las conexiones gráficas. ¿Alguna idea de por qué los controladores de estado de fila tomarán continuamente la "selección" una y otra vez (creando así un bucle entre los gráficos y congelando JMP) y por qué el mismo JSL en un script de gráficos no lo hace?
Realmente aprecio la ayuda @jthi & @txnelson !
Re: ¿Cómo vincular selecciones de gráficos con JSL?Gestionado, en algún momento, para generar un mensaje "útil" en el registro mejorado

Re: ¿Cómo vincular selecciones de gráficos con JSL?Están sucediendo algunas cosas no tan divertidas con los controladores de estado de fila (siempre trato de evitarlos, ya que no funcionan del todo mal en mi opinión). Intente ejecutar el ejemplo que proporcioné haciendo clic en filas individuales en Big Class y vea JMP Log.
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
Re: ¿Cómo vincular selecciones de gráficos con JSL?Eso es lo que he estado intentando, pero creo que no entiendo lo suficientemente bien los estados/controlador de estado de fila/banderas. Adjunto un video de lo que describí anteriormente. El gráfico que se muestra está relacionado con f2 y dt2:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);Al principio, pensé que arrastrar estaba causando un problema porque la selección cambiaba con cada nuevo punto agregado hasta que se completó el arrastre, pero según el resultado "group_selected" en el registro, ni siquiera parece que la selección esté cambiando . Me parece que el bucle se debe a la adición de una nueva selección dentro del controlador de estado de fila, pero no estoy seguro de cómo evitar esto para lograr mi objetivo de que ambos gráficos (y eventualmente más) se apunten entre sí.
Cualquier sugerencia es bienvenida.
Re: ¿Cómo vincular selecciones de gráficos con JSL?Usaría las declaraciones Show() para mostrar el estado de la bandera en el registro y luego arrastraría para ver si puede determinar dónde está el problema de tiempo.
Re: ¿Cómo vincular selecciones de gráficos con JSL?Muchas gracias por la respuesta, @txnelson ! Usar banderas es una buena idea. Desafortunadamente, todavía me encuentro con algunos problemas de recursividad... He jugado con diferentes ubicaciones de la variable de bandera y con mi comprensión limitada del JSL con el que estoy jugando, esta sintaxis actual tiene más sentido para mí (casi exactamente cómo está estructurado su pseudocódigo).Aquí esta el mio:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />Lo anterior funciona si hago selecciones haciendo clic en las etiquetas de la leyenda (¡sí!) y si hago selecciones singulares haciendo clic en marcadores individuales en el gráfico (¡sí!), pero entra en un bucle si trato de hacer selecciones arrastrando un panel de selección en la trama real (que es el escenario más probable de mi usuario).¿Se supone que mis variables de bandera son diferentes para cada función separada? Actualmente, la única forma en que puedo hacer que funcione como lo describí es usando la misma variable de bandera ... ¿Hay simplemente algo que estoy pasando por alto?
También parece cambiar de alguna manera mi variable de indicador "already_run" si incluso paso el mouse sobre el gráfico sin hacer clic en nada. ¿Esto se debe a cómo funciona el controlador de estado de fila?
¡Aprecio tu ayuda!
Re: ¿Cómo vincular selecciones de gráficos con JSL?Todos los gráficos que hayan sido generados a partir de una misma tabla de datos, automáticamente tendrán seleccionados sus puntos, líneas, etc., cuando en uno de los gráficos tenga puntos, líneas, etc. seleccionados.
Si los gráficos son de 2 tablas diferentes, se puede construir un controlador de estado de fila para cada una de las tablas de datos.Tiene razón en su declaración sobre un argumento circular, sin embargo, la forma en que lo he manejado es establecer una bandera en cada uno de los controladores que impide la continuación del ciclo.
Aquí hay una pieza simple de pseudocódigo que debería darle una idea de cómo configurarlo
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );Re: ¿Cómo vincular selecciones de gráficos con JSL?¿Hay alguna manera de usar los controladores de estado de fila de manera que una selección en Graph1 resalte información relevante en Graph2? y ¿viceversa? Puedo hacer que sea de una forma u otra, pero parece que si quiero hacer ambas cosas, se convierte en un argumento circular que congela a JMP...¿Existe una forma inteligente de señalar ambos gráficos/tablas de datos entre sí que no resulten en argumentos circulares?
Re: ¿Cómo vincular selecciones de gráficos con JSL?Cuando se seleccionan puntos o líneas en un gráfico de Graph Builder, Bivariate, etc., las filas asociadas con la selección se seleccionan en la tabla de datos asociada.Esto es independientemente de que la tabla sea visible o no.Por lo tanto, es bastante sencillo implementar un controlador de estado de fila, que se ejecutará cada vez que se detecte un cambio en la selección de filas.
Re: ¿Cómo vincular selecciones de gráficos con JSL?Gracias por la respuesta, @jthi ! No estoy seguro de que estas soluciones sean aplicables en mi caso, a menos que haya una manera de determinar las filas/columnas/índice/etc. seleccionados simplemente a partir de una selección realizada en el gráfico. Ninguna de las tablas de datos utilizadas en mi aplicación son visibles para que el usuario realice selecciones en... La idea es simplemente interactuar con las visualizaciones y el código hace todas las manipulaciones en las tablas detrás de escena.
Siento que tiene que haber alguna iteración de "<< Get Selected" para las selecciones de gráficos, pero no he encontrado la implementación correcta en el índice de secuencias de comandos. Si hay una línea JSL para eso, entonces creo que la idea "<< Add Graphics Script" que mencionaste podría funcionar bastante bien una vez que se hayan hecho las selecciones.
Re: ¿Cómo vincular selecciones de gráficos con JSL?Nunca he usado Application Builder, pero posiblemente podría usar Controladores de estado de fila.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
Otra opción podría ser usar Graph Script:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
Una opción más sería usar uniones virtuales, pero esto requeriría que tenga tablas de datos guardadas en algún lugar.