Obtener filas que se muestran actualmente en un dendrogramaHola,
Me gustaría saber si hay alguna manera de saber qué individuos se muestran actualmente en un dendrograma después de una acción de zoom.
Aquí hay un ejemplo:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Birth Death Subset.jmp" );
Hierarchical Cluster(
Y( :birth, :death ),
Label( :country ),
Method( "Ward" ),
Standardize Data( 1 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ),
SendToReport(
Dispatch( {}, "Dendrogram", OutlineBox, {SetHorizontal( 1 )} ),
Dispatch(
{"Dendrogram"},
"2",
ScaleBox,
{Min( 18 ), Max( 31 ), Inc( 5 ), Minor Ticks( 0 )}
)
)
);Me gustaría obtener la lista de los 13 países seleccionados.
Creo que una buena solución sería obtener los valores mínimo y máximo (18 y 31), pero hasta ahora no puedo encontrar cómo extraerlos ...
¡Gracias de antemano por tu ayuda!
Re: Obtener las filas que se muestran actualmente en un dendrogramaHola @txnelson ,
Nunca he usado esta funcionalidad pero realmente amplía las posibilidades de JMP, ¡qué bueno!
En mi situación, realmente no necesito seleccionar las filas, sino solo obtener los valores minOrder y maxOrder. Es por eso que creo que no habrá problemas de interferencia como lo menciona @Julian . Necesito probar eso 
¡Gracias de nuevo a los dos por su ayuda!
Re: Obtener las filas que se muestran actualmente en un dendrogramaAhí vamos. ¡Debería haber pensado en eso!
//Editar: Agregar esa secuencia de comandos de gráficos parece interferir con el doble clic para hacer zoom en el grupo seleccionado. Ciertamente hay alguna manera de hacer que funcione, pero el botón parece bastante infalible en este momento, especialmente si desea poder seleccionar individuos en el dendrograma pero luego restablecer la selección al zoom actual.
Re: Obtener las filas que se muestran actualmente en un dendrogramaPuede adjuntar un script de gráficos
obj << agregar secuencia de comandos de gráficos ()
a la caja de marcos del dendograma.Se activará cada vez que se haga algo en el gráfico.En el script agregado, puede verificar si minOrder o MaxOrder han cambiado.
Re: Obtener las filas que se muestran actualmente en un dendrogramaHola @anne_sa ,
Esa es una gran idea, pero no he encontrado una manera fácil de hacer que suceda. ¿Qué tal un botón en la parte inferior de la ventana para invocar la selección?
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Birth Death Subset.jmp" );
hcPlatform = Hierarchical Cluster(
Y( :birth, :death ),
Label( :country ),
Method( "Ward" ),
Standardize Data( 1 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ),
SendToReport(
Dispatch( {}, "Dendrogram", OutlineBox, {SetHorizontal( 1 )} ),
Dispatch( {"Dendrogram"}, "2", ScaleBox, {Min( 18 ), Max( 31 ), Inc( 5 ), Minor Ticks( 0 )} )
)
);
//save the order displayed in the platform
displayOrd = hcPlatform << Save Display Order;
selectZoom = expr(
//get the script, which contains the Min() and Max() information
exprPlat = hcPlatform << Get Script;
//Extract the Min and Max. This is indexed in the reverse of the Display Order
//that is, the max value is the first in the order (as if it is an axis), so subtracting
//this value from the number of rows in the table brings things into alignment
minOrder = 1 + N Rows( dt ) - Arg( Extract Expr( exprPlat, Max( Wild() ) ) );
maxOrder = N Rows( dt ) - Arg( Extract Expr( exprPlat, Min( Wild() ) ) );
//select the rows in the table that meet the condition of being in the randge displayed
dt << Select Where( And( As Column( displayOrd ) >= minOrder, As Column( displayOrd ) <= maxOrder ) );
//get the matrix of row numbers for the selected rows, i.e., rows displayed in zoom
matchingRows = dt << get selected rows;
);
//add the button to the report
report(hcPlatform)<<APPEND></APPEND>
@Julian
Re: Obtener las filas que se muestran actualmente en un dendrogramaHola @Julian ,
¡Muchas gracias por esta rápida respuesta, es exactamente lo que estaba buscando!
Solo tengo una pequeña pregunta adicional: ¿hay alguna forma de detectar que se ha realizado una acción de zoom en el dendrograma? Tal vez algo basado en la función <Re: Obtener las filas que se muestran actualmente en un dendrogramaMuy bien hecho.
Re: Obtener las filas que se muestran actualmente en un dendrograma
Hola @anne_sa ,
No conozco una forma directa de obtener esas filas, pero dado que la información mínima y máxima es parte del script de la plataforma, y dado que podemos guardar el orden de visualización de las filas en el dendrograma, podemos escribir nuestro camino. al resultado con un poco de trabajo. No es del todo elegante, pero he aquí una manera que se me ocurrió:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Birth Death Subset.jmp" );
hcPlatform = Hierarchical Cluster(
Y( :birth, :death ),
Label( :country ),
Method( "Ward" ),
Standardize Data( 1 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ),
SendToReport(
Dispatch( {}, "Dendrogram", OutlineBox, {SetHorizontal( 1 )} ),
Dispatch( {"Dendrogram"}, "2", ScaleBox, {Min( 18 ), Max( 31 ), Inc( 5 ), Minor Ticks( 0 )} )
)
);
//save the order displayed in the platform
displayOrd = hcPlatform << Save Display Order;
//get the script, which contains the Min() and Max() information
exprPlat = hcPlatform << Get Script;
//Extract the Min and Max. This is indexed in the reverse of the Display Order
//that is, the max value is the first in the order (as if it is an axis), so subtracting
//this value from the number of rows in the table brings things into alignment
minOrder = 1 + N Rows( dt ) - Arg( Extract Expr( exprPlat, Max( Wild() ) ) );
maxOrder = N Rows( dt ) - Arg( Extract Expr( exprPlat, Min( Wild() ) ) );
//select the rows in the table that meet the condition of being in the randge displayed
dt << Select Where( And( As Column( displayOrd ) >= minOrder, As Column( displayOrd ) <= maxOrder ) );
//get the matrix of row numbers for the selected rows, i.e., rows displayed in zoom
matchingRows = dt << get selected rows;
¡Espero que esto ayude!
@Julian