Hola,
Estoy usando un script de lo siguiente correo para intentar expandir el mapa de calor que se crea a partir del script. El script en su forma actual hace un mapa de calor para todas las columnas juntas, pero me gustaría un mapa de calor separado POR columna. En otras palabras, me gustaría encontrar el mínimo, medio y máximo para una determinada columna, luego aplicar un mapa de calor solo en esa columna, luego hacer lo mismo para la siguiente columna y continuar.
Se adjuntan los siguientes
1. sample_base_table.jmp: este es un conjunto de datos de muestra del que se extrae.
2. extract_cols.jsl: este es el script que resume los datos que se utilizarán para el script del mapa de calor
3. heatmap.jsl: este script hace el mapa de calor para las columnas especificadas
Asuntos:
Cuando ejecuto extract_cols.jsl obtengo 4 nuevas tablas de datos llamadas "Untitled X". Luego, cuando ejecuto heatmap.jsl, solo puedo crear un mapa de calor para la última tabla X sin título creada. No entiendo por qué esto es ... Cuando miro el código del depurador, dice "no se pudo encontrar la columna en el acceso o la evaluación de 'Columna'". Sin embargo, imprimo la columna que se usa "Mediana (valores, mango)" y aparece, así que no estoy seguro de lo que está sucediendo (vea la imagen de salida a continuación).

Mejoras / Trabajo futuro:
Idealmente, después de que pueda averiguar por qué solo se actualiza la última tabla de datos creada, me gustaría concatenar todas estas 4 columnas de mapa de calor de frutas en una tabla de datos que también contiene la información de países y frutas. En otras palabras, estoy generando 4 tablas (32x3) y me gustaría generar 1 tabla (6x32) (mapa de calor de 4 frutas + columna de países + columna de ubicaciones). Actualmente, lo que estoy haciendo es con JMP Query Builder para hacer la concatenación de columnas.
Estás especificando
Names Default To Here( 1 );
que crea un espacio de nombres de memoria separado para ese script específico.Es decir, en su script extract_cols, hay una lista llamada "fruta".Si en su secuencia de comandos de mapa de calor especificó
myFruit = fruit[1];
su script de mapa de calor no sabría nada sobre su variable llamada fruta.
En su secuencia de comandos de mapa de calor, establece la variable "dt" igual a la tabla de datos actual.A partir de su descripción, está ejecutando la secuencia de comandos del mapa de encabezados justo después de ejecutar la secuencia de comandos extract_cols.En un momento dado en JMP, solo hay 1 tabla de datos que es la tabla de datos activa actual.Por lo tanto, cuando especifica
dt = Current Data Table();
la secuencia de comandos del mapa de calor obtiene la tabla de datos activa actual, que sería la última tabla de datos que creó en la secuencia de comandos extract_cols
Si necesita pasar la referencia de la tabla de datos original al segundo script, y posiblemente las otras 4 referencias a la tabla de datos, una forma de hacerlo es crear un espacio de nombres separado y colocar las referencias en ese espacio de nombres.Aquí hay una modificación a su secuencia de comandos que crea el espacio de nombres y coloca las referencias de la tabla de datos en él.
Names Default To Here( 1 );
Clear Symbols();
dt = Current Data Table();
if(isnamespace("trans")==0, trans = new namespace("trans"));
trans:theList = {};
insert into(theList,dt);
fruit = {"Apple","Banana","Mango","Orange"};
For(i = 1, i <= N Items(fruit), i++,
obj = dt << Tabulate(
Set Format( Uniform Format( 10, 0 ) ),
Add Table(
Column Table(
Statistics( Median ),
Grouping Columns( :fruits ),
Analysis Columns( :Values )
),
Row Table( Grouping Columns( :Countries, :locations ) )
),
Local Data Filter(
Add Filter(
columns( :fruits),
Where( :fruits == fruit[i] ),
Display( :fruits, N Items( 14 ) )
)
)
);
trans:theList[i+1] = obj<< make into data table;
Current Report() << Close Window
);
Luego, puede hacer referencia al espacio de nombres en su secuencia de comandos de mapa de calor para obtener la referencia de la tabla principal o cualquiera de las referencias de la tabla de datos que se guardaron en el espacio de nombres.
Names Default To Here( 1 );
Clear Symbols();
dt = trans:thelist[1];
dt << Begin Data Update;
///////////////////////////////////
// Setting Variables for script ///
//rev_scale = "Reverse Scale";
rev_scale =0;
mean_median = 1; //mean=0, median=1
print(mean_median);
///////////////////////////////////
//gets all columns that are continous and stores that in a list as strings.
colList = dt << get column names( continuous, string );
print(colList);
// Create a temporary subset where the columns are the column list, selects all rows,
// invisible makes it so you don't see the datatable on screen since it is temporary
dtsub = dt << subset(columns(colList), selected rows(0),invisible);
// Move the data into a matrix this will be used later to get min, max, median|mean
allData = dtsub << get as matrix;
// Close the no longer needed temporary data table
close(dtsub, nosave);
// Calculate the statistics across the full data matrix
myMax = Maximum(allData);
myMin = Minimum(allData);
if(mean_median == 0,
myMid = Mean(allData),
myMid = Median(allData)
);
print(myMax);
print(myMin);
print(myMid);
print(colList);
// Run for loop over data table with the min, max and median|mean calculated from above
// gradient color scheme needs to be set.
if(rev_scale == 1,
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Column( __col__ ) <<
set property(
"color gradient",
{"Green Yellow Red",
Range( {__Max__, __Min__, __Mid__} ),"Reverse Scale"}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);
,
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Column( __col__ ) <<
//Column( colList[i] ) <<
set property(
"color gradient",
{"Green Yellow Red",
Range( {__Max__, __Min__, __Mid__} )}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);
);
¡Gracias por el aporte!
Cuando ejecuto el script extract_cols actualizado que proporcionó, aparece el siguiente mensaje de error sobre el acceso al valor L ...

mi error, cambio
insert into(theList,dt);
a
insert into(trans:theList,dt);
theList no existe ...... pero trans: theList sí