Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesJe cherche à ajouter des lignes de référence de colonne basées sur des données provenant d'une autre capacité de données. Par exemple, l'utilisation de "Big Class" mettrait à jour les colonnes "weight" et "height" avec les valeurs P50 et P95 d'une table de données de recherche.
Les lignes de la table de données de recherche correspondent aux noms de colonne de la table principale. Les lignes de référence doivent attribuer la valeur d'étiquette à partir du nom de colonne de la table de recherche "P50" ou "P95" et la valeur provient de la ligne de cette colonne.
Exemple montrant les lignes de référence d'axe de colonne ajoutées :

Exemple de table de données de recherche :

Je ne connais pas très bien JSL, j'apprécie donc toute aide qui se présente à moi sur ce sujet. J'ai créé un script mais il ne fait pas ce que je veux.
Il semble corrompre la colonne, parfois lors du traçage d'une distribution, il affiche toutes les valeurs '0'. De plus, si j'essaie d'ajouter à la fois des lignes de référence P50 et P95, seule la dernière est enregistrée dans la colonne et elle l'enregistre sur les deux colonnes.
dt = Open ("C:\Program Files\SAS\JMP\15\Samples\Data\big class.jmp");
dtLookup = New Table( "Lookup Table",
Add Rows( 2 ),
New Column( "Column Name",
Character,
Nominal,
Set Values( {"weight", "height"} )
),
New Column( "P50",
"Continuous",
Set Values( [100, 61] )
),
New Column( "P95",
"Continuous",
Set Values( [120, 70] )
)
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
numRowsLookup = N Rows( dtLookup );
numColsLookup = N Cols( dtLookup );
for(n=1,n<=numRowsLookup,n++,
col_name = dtLookup[n,1];
If(contains(col_name_list,col_name),
for(j=2,j<=numColsLookup,j++,
col = Column(dt, col_name);
col_name_Lookup = col_name_list_lookup[j];
value = Column(dtLookup,col_name_Lookup)[n];
col <<
Set Property("Axis",
{
//Add Ref Line( 63, "Dashed", "Orange", "P50", 2 )
Add Ref Line( value, "Dashed", "Orange", col_name_Lookup, 2 )
});
);
);
);
Merci,
Roger
Automatisation et scriptFusion et nettoyage des donnéesPersonnalisation de masseRe : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesMise à jour finale ici. Un merci spécial à Jarmo.
J'ai pu faire fonctionner cela comme prévu. Code final ici pour référence future.
Names Default To Here(1);
namespace("here")<<REMOVE></REMOVE> New Column("P99", "Continuous", Set Values([125, 75]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Analysis Columns"n; //Ref column name
new_properties = {}; // re-init
old_properties = {}; // re-init
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//Add Multiple Ref Lines
For( i = 2, i <= N Items( col_name_list_lookup ), i++,
new_properties_temp =
EvalExpr({
Add Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 67 )),Expr(char(col_name_list_lookup[i])), 1)
});
new_properties = Insert(new_properties, new_properties_temp);
);
//end Add Multiple
//Add Specified Reference Lines
//new_properties = EvalExpr({
// Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
// Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
//});
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
//show(prop_to_add); // for debug
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Applies the new axis settings.
);
);
Re : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesSalut Jarmo,
J'apprécie l'aide à ce sujet. Malheureusement, je ne voyais pas les anciennes et nouvelles propriétés d'axe mises à jour ici. J'ai vu la liste "prop_to_add" s'ajouter aux anciennes et nouvelles propriétés, mais lorsque je vérifie les paramètres réels de l'axe, je n'ai vu que les deux nouvelles propriétés.
Après avoir supprimé les accolades des propriétés définies, cela a pu fonctionner comme prévu !
Maintenant, j'ai juste besoin de travailler pour que cela fonctionne sur un nombre N de colonnes de recherche.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
//stop();
For Each Row(dtLookup,
//stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
//stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
//stop();
//Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)}))); // Didn't work with the braces.
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Worked when removing the braces.
);
);Re : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesVous pouvez essayer de déboguer le code en plusieurs parties. Vous pouvez "exécuter" For Each Row avec ligne par ligne en utilisant Row() = rownumber au lieu de la boucle.
//For Each Row(dtLookup,
Row() = 1;
col_name =:"Column Name"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);
Et puis commencez à exécuter le code ligne par ligne :
old_properties = Column(dt, col_name) << get property("Axis");
//Empty()
Quelques points d'arrêt pour le débogage (je n'utilise pas Debugger, mais ce serait probablement encore plus facile avec):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
stop();
For Each Row(dtLookup,
stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
stop();
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)})));
);
);
Index de script pour l'insertion :

Quelques liens pour aider à la rédaction de scripts :
Référence de la syntaxe JSL
Guide de script
Aide JMP16
Re : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesQue fait la fonction Insert() ici ? Je n'arrive pas à le faire fonctionner.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Column Names"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);Re : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesJe ne suis pas sûr à 100%, mais peut-être pourriez-vous d'abord obtenir les anciennes propriétés Axis avec << Get Propery ("Axis"), puis ajouter à cela.
Peut-être quelque chose comme ça (il pourrait aussi y avoir des moyens plus simples):
old_properties = Column(dt, "height") << get property("Axis");
old_with_new = Insert(old_properties, Expr(Add Ref Line(1, "Dashed", "Orange", "P45", 2)));
Eval(EvalExpr(column(dt, "height") << Set Property("Axis",{expr(old_with_new)})));Re : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesMerci Jarmo. Cette solution est beaucoup plus simple mais elle semble écraser toutes les lignes de référence d'axe existantes. Savez-vous s'il existe un moyen de conserver les lignes de référence de l'axe qui sont déjà présentes dans cette colonne ?
Re : Mettre à jour la ligne de référence de l'axe des colonnes en fonction des données d'une autre table de donnéesVoici un exemple de script. Je suppose que l'axe est remplacé si vous essayez de le faire plusieurs fois comme ça, vous devrez donc peut-être les ajouter dans le même << Set Property (plusieurs façons différentes de construire l'expression pour le faire).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
For Each Row(dtLookup,
col_name =:"Column Name"n;
//because we know we have only two lines to add and they are always added
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis", {
Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
}))
);
);

Pas sûr si Eval(EvalExpr()) est nécessaire ici, mais cela ne fera pas de mal.
Re: Mise à jour de la ligne de référence de l'axe des colonnes à partir des données d'une autre table de donnéesCe script JSL est très utile pour importer directement des données dans Axis. Serait-il possible d'y ajouter le paramètre d'étiquette ci-dessous ?
J'essaie d'ajouter/modifier votre code avec des paramètres supplémentaires, ce qui provoque une erreur.
Pour (i = 2, i <= N Items( col_name_list_lookup), i++,
nouvelles_propriétés_temp =
EvalExpr({
Ajouter une ligne de référence(Expr(as column(dtLookup,col_name_list_lookup[i])), "Pointillé", Expr(Color To RGB( 0 )),Expr(char(col_name_list_lookup[i])), 1,
Position de l'étiquette("À l'intérieur de la ligne"), Axe opposé(1))
)
});
nouvelles_propriétés = Insérer(nouvelles_propriétés, nouvelles_propriétés_temporaires);
);

Re: Mise à jour de la ligne de référence de l'axe des colonnes à partir des données d'une autre table de donnéesAssurez-vous que tous vos supports sont correctement positionnés.
Voir plus...
For(i = 2, i <= N Items(col_name_list_lookup), i++,
new_properties_temp = Eval Expr(
{Add Ref Line(
Expr(As Column(dtLookup, col_name_list_lookup[i])),
"Dashed",
Expr(Color To RGB(0)),
Expr(Char(col_name_list_lookup[i])),
1,
Label Position("Inside Inline"),
Opposite Axis(1)
)}
);
new_properties = Insert(new_properties, new_properties_temp);
);