Erstellen einer Heatmap auf einer Datentabelle und Aktualisieren des Farbverlaufs mit einem SkriptHallo,
Ich habe viele Daten, die ich gerne als Heatmap aus einer Datentabelle darstellen möchte. Ich habe unten ein Bild eines Beispielbilds einer Datentabelle und die Schritte angehängt, die ich zum Erstellen der Heatmap in der Datentabelle ausführe. Es folgt die folgenden Schritte:
- Erhalten Sie eine Datentabelle, nachdem Sie tabulate verwendet haben
- Stapeln Sie alle Spalten (außer „Typ“). Führen Sie dann eine Zusammenfassung des gesamten Datensatzes durch, um Min, Median und Max zu ermitteln.
- Nehmen Sie die Min-, Median- und Max-Werte aus Schritt 2 und fügen Sie sie in die Farbverlaufswerte ein.
Das Ergebnis der Datentabelle nach Ausführung dieser Schritte wird unten angezeigt. Derzeit mache ich Schritt 3 manuell, wobei ich jeden Wert, den ich nach der Zusammenfassung erhalte, in die Farbverlaufswerte eingebe. Gibt es eine Möglichkeit, die Werte (Min., Median, Max) aus der Datentabelle „Summary“ mit einem Skript zu übernehmen und in den Farbverlauf einzugeben?
Ich habe auch den Beispieldatensatz angehängt.


MassenanpassungBetreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenVielen Dank für alle Beiträge und Hilfe! Ich kannte den Scripting-Index nicht, er war eine große Hilfe. Ich habe den Code, den ich unten verwende, als meine endgültige Version gepostet
Names Default To Here( 1 );
Clear Symbols();
dt = Current Data Table();
///////////////////////////////////
// Setting Variables for script ///
rev_scale =1;
mean_median = 0; //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 );
// 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);
// 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__ ) <<
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
)
);
);
);Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenDie Funktionen „Maximum“, „Minimum“ und „Median“ führen keine kumulative Berechnung über eine Liste von Spalten durch.Der einfachste Weg, den ich gefunden habe, besteht darin, die referenzierten Spalten in eine Matrix umzuwandeln und dann die Statistiken zu berechnen, da die Funktionen Maximum, Minimum und Median über eine Matrix hinweg funktionieren.
Hier ist ein einfaches Skript, das diese Berechnung durchführt
Names Default To Here( 1 );
Clear Symbols();
dt = Open( "$SAMPLE_DATA/big class.jmp" );
colList = dt << get column names( continuous, string );
// Create a temporary subset to calculate the required overall statistics
dtsub = dt << subset(columns(colList), selected rows(0),invisible);
// Move the data into amatrix
allData = dtsub << get as matrix;
// Close the no longer needed temporary daa table
close(dtsub, nosave);
// Calculate the statistics across the full data matrix
myMax = Maximum(allData);
myMin = Minimum(allData);
myMid = Median(allData);
Ich empfehle Ihnen dringend, sich die Zeit zu nehmen, den Scripting Guide zu lesen, den Sie unter finden
Hilfe=>JMP-Dokumentationsbibliothek
Ich empfehle Ihnen außerdem, sich mit dem Skriptindex vertraut zu machen, der auch im Pulldown-Menü „Hilfe“ verfügbar ist.
Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenDanke, das kommt dem sehr nahe, was ich brauche! Das Einzige, was nicht stimmt, ist, dass die Heatmap den Gradienten basierend auf den Höchst-, Tiefst- und Mittelwerten für diese Spalte und nicht auf der Grundlage der gesamten Datentabelle angibt. Grundsätzlich möchte ich im folgenden Code Max, Min und Mid finden, bevor ich die for-Schleife eingebe, um die Zellen einzufärben. Wenn ich das mache, erkennen die Funktionen Maximum, Minimum und Median die colList, die zum Extrahieren des Maximalwerts übergeben wird, nicht. Gibt es eine Möglichkeit für JSL, das Maximum, das Minimum und den Median basierend auf der Liste zu ermitteln, wenn „Get Column Names“ ausgeführt wird? Oder muss das in eine for-Schleife gehen?
Names Default To Here( 1 );
Clear Symbols();
//dt = Open( "$SAMPLE_DATA/big class.jmp" );
dt = Current Data Table();
colList = dt << get column names( continuous, string );
myMax = Maximum(colList);
myMin = Minimum(colList);
myMid = Median(colList);
print(myMax);
print(myMin);
print(myMid);
print(colList);
For( i = 1, i <= N Items( colList ), i++,
/*
Eval(
Substitute(
Expr(
Summarize(
dt,
myMax = Max( __col__ ),
myMin = Min( __col__ ),
myMid = Mean( __col__ )
)
),
Expr( __col__ ), colList[i]
)
);
*/
Eval(
Substitute(
Expr(
Column( __col__ ) <<
set property(
"color gradient",
{"Green Yellow Red",
//Range( {__Max__, __Min__, __Mid__} ),"Reverse Scale"}
Range( {__Max__, __Min__, __Mid__} )}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenMein Fehler......die Anfangswerte von myMax usw. wurden aus früheren Ausführungen übernommen, als ich das Skript schrieb.Unten finden Sie eine Lösung
Names Default To Here( 1 );
Clear Symbols();
dt = Open( "$SAMPLE_DATA/big class.jmp" );
colList = dt << get column names( continuous, string );
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Summarize(
dt,
myMax = Max( __col__ ),
myMin = Min( __col__ ),
myMid = Mean( __col__ )
)
),
Expr( __col__ ), 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
)
);
);Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenWenn ich Ihr Skript unverändert ausführe (unter Verwendung eines großen Klassendatensatzes), stürzt es bei mir ab und ich erhalte die folgende Meldung:
Name Unresolved: myMax in access or evaluation of 'myMax' , myMax/*###*/
at line 25 in Script 4.jsl
Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenHier ist ein Beispiel, das die Spaltenfärbung der Beispieldatentabelle „Big Class“ automatisiert.Sie sollten in der Lage sein, von diesem Skript abzuzweigen, damit es mit Ihren Daten funktioniert
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
colList = dt << get column names( continuous, string );
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Summarize(
dt,
myMax = Max( As Column( __col__ ) ),
myMin = Min( As Column( __col__ ) ),
myMid = Mean( As Column( __col__ ) )
);
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
)
)
);Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenDanke für den Beitrag! Ich verwende Ihr Skript als guten Ausgangspunkt, hatte aber gehofft, es dynamischer zu gestalten.
- Wenn Sie also im Skript die maximalen, minimalen und mittleren Werte manuell festlegen, gibt es eine Möglichkeit, diese durch die Ausgabezusammenfassungstabelle in Schritt 2 im Bild festzulegen. Grundsätzlich liegen diese Höchst-, Mindest- und Mittelwerte im Bereich für Gruppe:0. Test: AI möchte die Höchst-, Mindest- und Mittelwerte des Geltungsbereichs für die gesamte Tabelle erhalten.
- Ich musste Color Cell by Value(1) in mein Skript einfügen und habe versucht, auch die umgekehrte Skalierung festzulegen und habe Fehlermeldungen erhalten. Haben Sie eine Idee, wie das geht?
- Kann man auch mit Sicherheit davon ausgehen, dass ich zum Ausführen des Farbverlaufs für alle Spalten nur eine for-Schleife außerhalb des von Ihnen gesendeten Codes benötigen würde? Oder gibt es eine andere Möglichkeit, dies zu tun?
names default to here(1);
dt=current data table();
dt:"Group:0, test:A" << set property("color gradient",{"Green Yellow Red", Range(
{-142.439058836207, -42.6065023706896, -97.9221899694684}
)});
Max = -142.439058836207;
Min = -42.6065023706896;
Mid = -97.9221899694684;
Eval(
Substitute(
Expr(
dt:"Group:0, test:A"n << set property(
"color gradient",
{"Green Yellow Red", Range( {__Max__, __Min__, __Mid__} )},
)
:dt << Color Cell by Value( 1 );
),
Expr( __Max__ ), Max,
Expr( __Min__ ), Min,
Expr( __Mid__ ), Mid
)
);Betreff: Heatmap auf einer Datentabelle erstellen und Farbverlauf mit Skript aktualisierenHier ist die JSL, die den Farbverlauf festlegt
names default to here(1);
dt=current data table();
dt:"Group:0, test:A"n << set property("color gradient",{"Green Yellow Red", Range(
{-142.439058836207, -42.6065023706896, -97.9221899694684}
)});
Ich finde, der einfachste Weg, die Werte in die erforderlichen Listen einzufügen, ist die Verwendung von Code ähnlich dem folgenden:
Max = -142.439058836207;
Min = -42.6065023706896;
Mid = -97.9221899694684;<BR />
Eval(
Substitute(
Expr(
dt:"Group:0, test:A"n << set property(
"color gradient",
{"Green Yellow Red", Range( {__Max__, __Min__, __Mid__} )}
);
),
Expr( __Max__ ), Max,
Expr( __Min__ ), Min,
Expr( __Mid__ ), Mid
)
);