Hallo,
Ich verwende ein Skript aus dem Folgenden Post um zu versuchen, die aus dem Skript erstellte Heatmap zu erweitern. Das Skript in seiner aktuellen Form erstellt eine Heatmap für alle Spalten zusammen, aber ich möchte eine separate Heatmap PER-Spalte. Mit anderen Worten, ich möchte die Min, Mid und Max für eine bestimmte Spalte finden, dann eine Heatmap nur auf diese Spalte anwenden, dann dasselbe für die nächste Spalte tun und fortfahren.
Im Anhang sind die folgenden
1. sample_base_table.jmp: Dies ist ein Beispieldatensatz, aus dem extrahiert wird.
2. Extract_cols.jsl: Dies ist das Skript, das die für das Heatmap-Skript zu verwendenden Daten zusammenfasst
3. heatmap.jsl: Dieses Skript erstellt die Heatmap für die angegebenen Spalten
Probleme:
Wenn ich extract_cols.jsl ausführe, erhalte ich 4 neue Datentabellen namens "Untitled X". Wenn ich dann heatmap.jsl ausführe, kann nur eine Heatmap für die zuletzt erstellte X-Tabelle ohne Titel erstellt werden. Ich verstehe nicht warum das so ist... Wenn ich mir den Debugger-Code ansehe, heißt es "Spalte im Zugriff oder Auswertung von 'Spalte' konnte nicht gefunden werden". Ich drucke jedoch die verwendete Spalte "Median(Values, Mango)" aus und sie wird angezeigt, sodass ich nicht sicher bin, was passiert (siehe Ausgabebild unten).

Verbesserungen/zukünftige Arbeiten:
Nachdem ich herausgefunden habe, warum nur die zuletzt erstellte Datentabelle aktualisiert wird, möchte ich idealerweise alle diese 4 Heatmap-Spalten von Früchten in einer Datentabelle verketten, die auch die Länder- und Fruchtinformationen enthält. Mit anderen Worten, ich erzeuge 4 (32x3) Tabellen und möchte 1 (6x32) Tabelle (4 Frucht-Heatmap + Länderspalte + Standortspalte) generieren. Derzeit mache ich die Spaltenverkettung mit JMP Query Builder.
Sie spezifizieren
Names Default To Here( 1 );
wodurch ein separater Speichernamespace für dieses spezifische Skript erstellt wird.Das heißt, in Ihrem Extract_cols-Skript gibt es eine Liste mit dem Namen "Frucht".Wenn Sie in Ihrem Heatmap-Skript angegeben haben
myFruit = fruit[1];
Ihr Heatmap-Skript würde nichts über Ihre Variable namens fruit wissen.
In Ihrem Heatmap-Skript setzen Sie die Variable "dt" gleich der aktuellen Datentabelle.Nach Ihrer Beschreibung führen Sie das Headmap-Skript direkt nach dem Ausführen des Extract_cols-Skripts aus.In JMP gibt es zu jedem Zeitpunkt nur 1 Datentabelle, die die aktuell aktive Datentabelle ist.Daher, wenn Sie angeben
dt = Current Data Table();
Das Heatmap-Skript ruft die aktuell aktive Datentabelle ab, die die letzte Datentabelle wäre, die Sie im Skript extrahieren_cols erstellt haben
Wenn Sie die ursprüngliche Datentabellenreferenz an das zweite Skript und möglicherweise die anderen 4 Datentabellenreferenzen übergeben müssen, besteht eine Möglichkeit darin, einen separaten Namespace zu erstellen und die Referenzen in diesen Namespace zu platzieren.Hier ist eine Änderung an Ihrem Skript, die den Namespace erstellt und die Datentabellenreferenzen darin platziert.
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
);
Anschließend können Sie in Ihrem Heatmap-Skript auf den Namespace verweisen, um die primäre Tabellenreferenz oder eine der Datentabellenreferenzen abzurufen, die im Namespace gespeichert wurden.
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
)
);
);
);
Danke für die Eingabe!
Wenn ich das aktualisierte Extract_cols-Skript ausführe, das Sie bereitgestellt haben, erhalte ich die folgende Fehlermeldung zum L-Wert-Zugriff ...

mein Fehler, ändern
insert into(theList,dt);
zu
insert into(trans:theList,dt);
theList existiert nicht......aber trans:theList existiert