[Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasEstimados,
Actualmente utilizo JMP16 para crear un gráfico.
Tengo una columna con una imagen y quiero fijar la imagen a cada punto que he seleccionado, así que activo la opción "añadir etiqueta" de esta columna.
Pero descubro que solo puedo hacerlo colocando el puntero sobre el punto, esperando a que aparezca la etiqueta emergente y luego haciendo clic en el botón de anclaje para fijarlo uno por uno.
¿Existe alguna forma más rápida de lograr esto, como con código JSL? Necesito mostrar millones de imágenes en filas.
¡gracias!
Automatización y secuencias de comandosRe: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¿Debe ser una etiqueta emergente? ¿O podrías usar la imagen como símbolo en tu gráfico? Por ejemplo, usando el conjunto de datos de muestra Big Class Families:

Si solo desea imágenes para las filas seleccionadas, puede seleccionarlas y nombrar la selección en la columna, y luego usar esa columna para crear una columna de transformación, como esta:
// Open Data Table: Big Class Families.jmp
// → Data Table( "Big Class Families" )
Open( "$SAMPLE_DATA/Big Class Families.jmp" );
// Name selection in column: Use Images
Data Table( "Big Class Families" ) << Clear Select <<
Select Rows( [1, 6, 14, 15, 16] ) <<
Name Selection in Column( Column Name( "Use Images" ), Selected( 1 ) );
Graph Builder(
Transform Column( "Transform[height]", Formula( :height * :Use Images ) ),
Size( 648, 551 ),
Show Control Panel( 0 ),
Variables(
X( :weight ),
Y( :height ),
Y( :"Transform[height]"n, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ),
Points( X, Y( 2 ), Legend( 5 ), Set Shape Column( :picture ) )
)
);
Incluí el script para que puedas ver los resultados con un solo clic, pero todo esto se puede hacer dentro de Graph Builder sin necesidad de scripts. Las funciones clave son Transformar columnas y Establecer forma de columna .
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasAquí hay un ejemplo de cómo fijar las etiquetas emergentes. Es interesante que la selección se base en índice cero. Quizás convenga modificarlo para que gestione el caso en el que no haya filas seleccionadas.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Select Rows( [1 5 7] );
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr(
dt << Graph Builder(
Size( 658, 556 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport( Dispatch( {}, "Graph Builder", FrameBox, __pin_expr__ ) )
)
),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);

Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¡Gracias por la respuesta! Usar la opción "Establecer columna de forma" funciona de maravilla, pero sería aún mejor si también se pudieran mostrar los puntos. ¡Sin duda, es una solución muy práctica!
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas
For Each( {v, i}, row_selection,
local_x = Column( dt, col_x )[v];
local_y = Column( dt, col_y )[v];
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Origin( {Expr( local_x ), Expr( local_y )} ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) ),
Offset( {-50, -45} ),
Replace Text( " " ),
Filled( 0 ),
Tag Line( 1 )
)}
)
)
);
);
¡Genial! Funciona, pero todas mis anotaciones se fijaron en la misma posición sin la configuración de Origen . Para solucionarlo, leí los valores de los ejes x/y y los asigné al Origen . Si bien esto funciona perfectamente con ejes numéricos, pasar valores de columna de caracteres provoca que la aplicación se bloquee. ¿Existe alguna solución para las columnas de caracteres? ¡Gracias!
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasPara las columnas nominales/ordinales, el eje comienza en 0 y cada valor lo incrementa en 1. Puede verificar esto en la configuración del eje.

Puedes escribir una lógica que se encargue de esto basándote en la tabla de datos o, si tienes un gráfico de puntos, puedes obtener los valores de los marcadores.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
ms = report(gb)[framebox(1)] << find seg(markerseg(1));
Show(ms << Get X Values, ms << Get Y Values);
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¡Gracias! Parece que devuelve todos los valores X/Y, pero ¿cómo puedo leer las filas seleccionadas (X/Y)? Intenté usar el código de abajo, pero las coordenadas X/Y que devuelve no coinciden con las que seleccioné.
r = dt << Get Selected Rows();
ms = Report(gb)[framebox(1)] << Find Seg( Marker Seg( 1 ) );
For Each( {v, i}, r,
t = ms << Get Point( v );
x = t[1];
y = t[2];
show(x,y);
);
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasPara mí esto parece devolver valores correctos.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
For Each({currow}, selrows,
coord = ms << Get Point(currow);
Show(coord);
);

coord = {0, 59};
coord = {1, 61};
coord = {1, 65};
coord = {1, 63};
coord = {2, 61};
coord = {2, 62};
coord = {3, 67};
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasAh, ya veo el problema: ocultar o excluir filas provoca una discrepancia en el índice de los datos restantes.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
Al usar este código, cuando la fila 17 esté oculta/excluida, las anotaciones de las filas 20/30 se desplazarán a posiciones incorrectas.
¿Hay alguna forma de evitar que esto suceda? Me refiero a que, sin duda, tengo puntos de datos que deben excluirse.
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¡Esto funciona, gracias chicos!
ex = dt << Get Excluded Rows;
pin_expr = {};
For Each( {v}, dt << Get Selected Rows,
offset = N Rows(Loc(ex < v));
coord = ms << Get Point(v - offset);
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasYo eliminaría las filas excluidas de selrows.
selrows = dt << Get Rows Where(Selected() & !Excluded())
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasMalas noticias si el generador de gráficos tiene un filtro de datos local y el índice no coincide.
¿Existe alguna forma de trabajar con gráficos que tengan activado el filtro local?
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasPuedes obtener las filas que mostrará el filtro de datos local enviando un mensaje.
<< Get Filtered Rows;
al filtro de datos local
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¡Gracias por tu ayuda! ¡Ya casi lo logro!
Por cierto, ¿hay alguna forma de eliminar en lote las anotaciones añadidas por los scripts?
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasSi puedes obtener referencias a todos ellos, creo que podrías establecer un mensaje de << Cerrar o << Eliminar en la lista para eliminarlos todos al mismo tiempo. También podrías usar << inval antes de la eliminación y << actualizar ventana después.
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasMi código está diseñado para un constructor de gráficos existente obtenido por gb = (Current Report() << Find( "Graph Builder" )) << Get Scriptable Object;
Luego creé un bucle Eval como lo hizo mmarchandFSLR:
Parece que solo puedo acceder al propio GB, pero no hay ningún lugar para definir la lista de anotaciones de pines adicionales desde el código a continuación:
¿Hay alguna forma de leer el ID único o algo similar de cada uno y asignarle << delete?
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
.....
If( N Items( pin_expr ) > 0,
Eval(
Substitute(
Expr(
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
),
Expr( __pin_expr__ ), Name Expr( pin_expr ),
)
)
);
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasNames Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt << select rows([1, 10, 21, 30, 40]);
gb = dt << Graph Builder(
Size(658, 556),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
pins = {};
gb << inval;
frame = Report(gb)[FrameBox(1)];
For Each({currow}, dt << Get Selected Rows,
Eval(EvalExpr(
Insert Into(pins, frame << Add Pin Annotation(
Seg(Marker Seg(1)),
Index(Expr(currow - 1)),
Index Row(Expr(currow - 1)),
UniqueID(Expr(currow - 1))
));
));
);
gb << update window;
wait(1); // demo purposes
pins << Delete;
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasAh, ya veo el problema: ocultar o excluir filas provoca una discrepancia en el índice de los datos restantes.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
Al usar este código, cuando la fila 17 esté oculta/excluida, las anotaciones de las filas 20/30 se desplazarán a posiciones incorrectas.
¿Hay alguna forma de evitar que esto suceda? Me refiero a que, sin duda, tengo puntos de datos que deben excluirse.
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¡Gracias jthi! ¡Lo aprecio mucho!
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas@jthi Disculpa, pero ¿hay alguna forma de ejemplo, como en el informe actual o en la tabla de datos actual, de obtener el marco actual seleccionado por el usuario?
Utilizo esto, pero solo si el gráfico tiene el script añadido.
For Each( {f, n}, frames,
Eval( Eval Expr( f << AddGraphicsScript( Handle( ::currentFrame = Expr( f ) ) ) ) )
);
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasPuedes usar XPath para buscar el atributo seleccionado (con valor verdadero).
Names Default To Here(1);
//This message applies to all display box objects
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Run Script("Bivariate");
Report(biv)[FrameBox(1)] << Select(1);
report(biv) << XPath("//FrameBox[@selected='true']");
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadas¡Gracias! Necesito seleccionar el marco que se encuentra debajo del cursor del ratón (ya sea al pasar el ratón por encima o al hacer clic). Pensé en usar S + Clic para seleccionarlo, pero ¿hay alguna forma más sencilla de hacerlo?
Re: [Creador de gráficos] Fijar en lote la etiqueta emergente para las filas seleccionadasRealizar estas acciones es mucho más difícil en JMP, ya que no se tiene fácil acceso a la ubicación del cursor (en la mayoría de los casos) e incluso si se tuviera, habría que calcular qué marco se encuentra bajo las coordenadas. Se puede obtener el clic, pero primero hay que añadir un script gráfico a cada uno de los cuadros de marco (los scripts gráficos se activan al hacer clic con el ratón, al pasar el cursor sobre los puntos, al mantener pulsado y arrastrar, etc.). Dependiendo de la función del script, existen otras opciones; por ejemplo, se puede proporcionar al usuario una lista de cuadros de marco, permitirle seleccionar a cuál añadir el script gráfico y, a continuación, solicitarle que pulse Aceptar.