Création d'une carte thermique sur une table de données et mise à jour du dégradé de couleurs avec un scriptSalut,
J'ai beaucoup de données que j'aime tracer sous forme de carte thermique à partir d'une table de données. J'ai joint une image ci-dessous d'un exemple d'image de table de données et les étapes que je fais pour créer la carte thermique sur la table de données. Il suit les étapes suivantes :
- Obtenez un datatable après avoir utilisé tabulate
- Empilez toutes les colonnes (sauf 'type'). Faites ensuite un résumé de l’ensemble des données pour trouver le minimum, la médiane et le maximum.
- Prenez les valeurs min, médiane et max de l'étape 2 et placez-les dans les valeurs de dégradé de couleur.
Le résultat du tableau de données après l'exécution de ces étapes est présenté ci-dessous. Actuellement, je fais l'étape 3 manuellement où, quelle que soit la valeur que j'obtiens après le résumé, je saisis les valeurs de dégradé de couleur. Existe-t-il un moyen de prendre les valeurs (min, médiane, max) de la table de données récapitulative avec un script et de les saisir dans le dégradé de couleurs ?
J'ai également joint l'exemple d'ensemble de données.


Personnalisation de masseRe : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptMerci pour toutes vos contributions et votre aide ! Je n'étais pas au courant de l'index de script, c'était d'une grande aide. J'ai posté le code que j'utilise ci-dessous comme version finale
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
)
);
);
);Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptLes fonctions Maximum, Minimum et Médiane n'effectueront pas de calcul cumulatif sur une liste de colonnes.Le moyen le plus simple que j'ai trouvé pour ce faire est de convertir les colonnes référencées en une matrice, puis de calculer les statistiques, car les fonctions Maximum, Minimum et Médiane fonctionneront sur une matrice.
Voici un script simple qui fait ce calcul
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);
Je vous recommande fortement de prendre le temps de lire le Guide de Scripting, qui se trouve sous la rubrique
Aide=>Bibliothèque de documentation JMP
Je vous suggère également de vous familiariser avec l'index de script, également disponible dans le menu déroulant Aide.
Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptMerci, c'est très proche de ce dont j'ai besoin ! La seule chose qui cloche est que la carte thermique donne le gradient basé sur le maximum, le minimum et le milieu de cette colonne au lieu de l'ensemble de la table de données. Fondamentalement, dans le code ci-dessous, je veux trouver max, min et mid avant d'entrer dans la boucle for pour colorer les cellules. Lorsque je fais cela, les fonctions Maximum, Minimum et Median ne reconnaissent pas la colList transmise pour extraire la valeur maximale. Existe-t-il un moyen pour JSL de trouver le maximum, le minimum et la médiane en fonction de la liste lors de l'exécution des noms de colonnes ? Ou est-ce que cela doit entrer dans une boucle for ?
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
)
);
);Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptMon erreur......les valeurs initiales de myMax etc. ont été reportées des exécutions précédentes pendant que j'écrivais le script.Ci-dessous un correctif
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
)
);
);Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptLorsque j'exécute votre script tel quel (en utilisant un grand ensemble de données de classe), il plante pour moi et je reçois le message ci-dessous :
Name Unresolved: myMax in access or evaluation of 'myMax' , myMax/*###*/
at line 25 in Script 4.jsl
Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptVoici un exemple qui automatise la coloration des colonnes de l’exemple de table de données Big Class.Vous devriez pouvoir vous éloigner de ce script pour le faire fonctionner avec vos données
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
)
)
);Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptMerci pour la contribution ! J'utilise votre script comme un bon point de départ mais j'espérais le rendre plus dynamique.
- Ainsi, dans le script, vous définissez manuellement les valeurs max, min et mid to. Existe-t-il un moyen pour qu'elles soient définies par le tableau récapitulatif de sortie à l'étape 2 de l'image. Fondamentalement, ces max, min et mid sont dans la portée du test Group:0 : AI aimerait obtenir la portée max, min et mid pour l'ensemble de la table.
- J'ai dû ajouter Color Cell by Value(1) dans mon script et j'ai également essayé de définir une échelle inversée et j'ai reçu des messages d'erreur. Une idée de comment procéder ?
- Est-il également prudent de supposer que pour exécuter le dégradé de couleurs sur toutes les colonnes, j'aurais besoin d'une boucle for en dehors du code que vous avez envoyé ? Ou est-ce qu'il y a un autre moyen de le faire?
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
)
);Re : Création d'une heatmap sur une table de données et mise à jour du dégradé de couleurs avec un scriptVoici le JSL qui définira le dégradé de couleurs
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}
)});
Je trouve que le moyen le plus simple d'insérer les valeurs dans les listes requises est d'utiliser un code similaire à celui ci-dessous :
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
)
);