Ciao,
Sto usando uno script dal seguente inviare per provare ad espandere la mappa di calore creata dallo script. Lo script nella sua forma attuale esegue una mappa di calore per tutte le colonne insieme, ma vorrei una mappa di calore separata PER colonna. In altre parole, vorrei trovare il minimo, il medio e il massimo per una determinata colonna, quindi applicare una mappa termica solo su quella colonna, quindi fare la stessa cosa per la colonna successiva e continuare.
In allegato le seguenti
1. sample_base_table.jmp: questo è un insieme di dati campione da cui viene estratto.
2. extract_cols.jsl: questo è lo script che riassume i dati da utilizzare per lo script heatmap
3. heatmap.jsl: questo script esegue la mappa di calore per le colonne specificate
Problemi:
Quando eseguo extract_cols.jsl ottengo 4 nuovi datatable denominati "Untitled X". Quindi, quando eseguo heatmap.jsl, è solo in grado di creare una mappa di calore per l'ultima tabella Untitled X creata. Non capisco perché questo sia... Quando guardo il codice del debugger, dice "Impossibile trovare la colonna nell'accesso o nella valutazione di 'Colonna'". Tuttavia, stampo la colonna utilizzata "Mediana (valori, mango)" e viene visualizzata, quindi non sono sicuro di cosa stia succedendo (vedi immagine di output sotto).

Miglioramenti/Lavori futuri:
Idealmente, dopo aver capito perché viene aggiornata solo l'ultima tabella di dati creata, vorrei concatenare tutte queste 4 colonne di heatmap di frutta in una tabella di dati che contenga anche i Paesi e le informazioni sulla frutta. In altre parole sto generando 4 tabelle (32x3) e vorrei generare 1 (6x32) tabella (4 heatmap di frutta + colonna paesi + colonna posizioni). Attualmente il modo in cui sto facendo è con JMP Query Builder per eseguire la concatenazione delle colonne.
stai specificando
Names Default To Here( 1 );
che crea uno spazio dei nomi di memoria separato per quello script specifico.Cioè, nel tuo script extract_cols, c'è un elenco chiamato "fruit".Se nello script della mappa di calore hai specificato
myFruit = fruit[1];
il tuo script di heatmap non saprebbe nulla della tua variabile chiamata fruit.
Nello script della mappa di calore, imposti la variabile "dt" uguale alla tabella dati corrente.Dalla tua descrizione, stai eseguendo lo script headmap subito dopo aver eseguito lo script extract_cols.In un dato momento in JMP, c'è solo 1 tabella dati che è la tabella dati attiva corrente.Quindi quando specifichi
dt = Current Data Table();
lo script heatmap ottiene la tabella dati attiva corrente, che sarebbe l'ultima tabella dati creata nello script extract_cols
Se è necessario passare il riferimento alla tabella dati originale al secondo script e possibilmente gli altri 4 riferimenti alla tabella dati, un modo per farlo è creare uno spazio dei nomi separato e inserire i riferimenti in quello spazio dei nomi.Ecco una modifica al tuo script che crea lo spazio dei nomi e inserisce i riferimenti della tabella dati in esso.
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
);
Quindi puoi fare riferimento allo spazio dei nomi nello script della mappa di calore per ottenere il riferimento alla tabella primaria o uno qualsiasi dei riferimenti alla tabella dati che sono stati salvati nello spazio dei nomi.
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
)
);
);
);
Grazie per l'input!
Quando eseguo lo script extract_cols aggiornato che hai fornito, ottengo il seguente messaggio di errore di seguito sull'accesso al valore L...

errore mio, cambia
insert into(theList,dt);
per
insert into(trans:theList,dt);
theList non esiste......ma trans:theList sì