Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphesJe tente de créer un script de session pour générer des graphiques à l'aide de Graph Builder de JMP. Cependant, une difficulté se pose : le nombre de colonnes de mes données varie selon la période à chaque mise à jour, ce qui m'oblige à modifier manuellement le script Graph Builder à chaque fois.
To address this, I am considering a method where column names are prefixed (e.g., A_, B_, C_). This would allow me to dynamically assign columns: for instance, columns prefixed with A_ could be directed to the Local Data Filter, those with B_ to the Column Switcher, and so forth.
Je souhaiterais savoir comment implémenter cette approche en JSL (JMP Scripting Language), car je n'ai pas réussi à écrire un script efficace moi-même. Vous avez mentionné avoir une ébauche de code JSL incomplète, mais elle n'était pas incluse dans votre demande. Si vous pouviez me la fournir, je serais ravi de vous aider à l'améliorer ou de vous suggérer une solution.
Je rencontre également l'erreur suivante : → [Pour chaque, Argument incorrect (colName), Pour chaque/*###*/(colName, columnNames,... L'argument doit être une liste. ]
dt = Current Data Table();
A_list = {};
B_list = {};
columnNames = As List(dt << Get Column Names("String"));
For Each(colName, columnNames,<BR />
If(Contains(colName, "A_"),
Insert Into(A_list, colName)
);
If(Contains(colName, "B_"),
Insert Into(B_list, colName)
);
);
Graph Builder(
Variables(
X( :point ),
Y( :avg ),
Y( :stddev ),
Page( :category ),
Color(B_list[1])
),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Legend( 27 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 29 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Legend( 28 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 31 ) )
),
Local Data Filter(
Conditional,
Add Filter(
columns( A_list ),
Display( A_list[1], N Items( 7 ), Find( Set Text( "" ) ) ),
Display( A_list[2], N Items( 7 ) ),
Display( :key, N Items( 12 ) )
)
),
Column Switcher(
:msr_dt,
B_list
)
);
Automatisation et scriptageRe: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesAvez-vous envisagé d'utiliser des balises de colonne pour « regrouper » les colonnes ?
Cela pourrait offrir une fonctionnalité similaire, et cela permet même le chevauchement des « groupes ».
Quelque chose comme :
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt:sex << setProperty( "Tags", {"pick"} );
dt:height << setProperty( "Tags", {"pick"} );
dt:weight << setProperty( "Tags", {"pick"} );
cols = dt << Get Tagged Columns( "pick" );
dt << Distribution( Column( Eval(cols) ));
Au fait, c'est pour chaque ({col}, cols, body)
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiques
Merci pour votre réponse, hogi.
Je n'avais pas pensé aux balises de colonne. Je vais essayer de corriger le script en utilisant à nouveau les balises de colonne.
Je répondrai après avoir fait cela.
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesSelon votre cas d'utilisation, vous pouvez utiliser des balises comme celles déjà suggérées, une propriété de colonne personnalisée, des noms de colonnes préfixés, des groupes de colonnes… Toutes ces options ont leurs avantages et leurs inconvénients.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << Get Column Names("String");
npn_cols = Filter Each({colname}, collist, Starts With(colname, "NPN"));
pnp_cols = Filter Each({colname}, collist, Starts With(colname, "PNP"));
gb = dt << Graph Builder(
Variables(X(:SITE), Y(:IVP1), Color(pnp_cols[1])),
Elements(
Position(1, 1),
Points(X, Y(1), Legend(27))
),
Elements(
Position(1, 2),
Points(X, Y(1), Legend(28)),
Line(X, Y(2), Y(3), Color(0), Legend(31))
)
);
filter_cols = npn_cols[1::2];
Insert Into(filter_cols, "SITE");
ldf = gb << Local Data Filter(
Conditional,
Add Filter(
columns(Eval(filter_cols)),
Display(filter_cols[1]),
Display(filter_cols[2]),
Display(filter_cols[3])
)
);
cw = gb << Column Switcher(pnp_cols[1], pnp_cols);
Aussi… est-ce une sorte de question hybride entre une question de la communauté et une consigne de LLM (nous sommes des humains ici dans la Communauté, espérons-le) ?
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesVeuillez excuser ma réponse en japonais (je pensais que cela permettrait de mieux exprimer mes véritables intentions).
Nous partageons désormais avec la communauté les cas où JMP learnBot n'a pas pu résoudre le problème.
En fin de compte, j'utilise cette communauté pour améliorer mes propres compétences en programmation en apprenant différentes méthodes et en recevant des conseils de personnes compétentes, et aussi pour contribuer au développement des compétences des autres utilisateurs de JMP qui m'entourent.
Je suis sincèrement désolé(e), car je crains d'avoir offensé jthi, qui répond toujours si gentiment à mes questions. Si ma question était mal formulée ou inappropriée, je vous serais reconnaissant(e) de bien vouloir me le signaler à l'avenir.
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesVotre message ne m'a pas offensé, mais plutôt mis mal à l'aise, car j'ai eu l'impression qu'on nous forçait à répondre. Je vous suggère donc clairement de séparer le message d'incitation si vous en avez utilisé un.
LearnBot n'est pas très performant avec JSL car il n'est pas configuré pour cela. L'Assistant pourrait être légèrement meilleur, mais vous obtiendrez probablement de meilleurs résultats en utilisant un LLM (comme Claude, de préférence un LLM auquel votre entreprise a accès) afin qu'il comprenne ce qu'il doit faire (JSL).
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesComme Jthi l'a souligné, je n'avais pas fait de distinction claire dans mon esprit entre les demandes de LLM et les messages destinés à la communauté des utilisateurs de JMP.
À l'avenir, j'examinerai attentivement le contenu afin de déterminer s'il s'agit d'une question pour LLM ou d'une publication plus appropriée pour la communauté des utilisateurs de JMP. Merci d'avoir souligné les points importants à prendre en compte pour une communication plus fluide.
Je compte sur votre soutien continu.
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesSi vous cherchiez des informations sur le fonctionnement du script, voici une version mise à jour qui pourrait vous aider à démarrer. J'ai commenté quelques sections modifiées ; notez que la plus complexe consiste à insérer une liste de colonnes dans le filtre de données local, ce qui a nécessité l'utilisation des fonctions Eval( et Eval Insert()). Vous pouvez consulter la documentation sur l'insertion d'une expression dans une autre à l'aide des fonctions Eval Insert, Eval Expr, Parse et Substitute pour découvrir d'autres options.
Names default to here(1);
Random reset(1);
msr_dt = New Table( "Example Data",
Add Rows( 200 ),
New Column( "A_1", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "ABC", floor(Random uniform( 4 )),1) ))),
New Column( "A_2", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "DEF", floor(Random uniform( 4 )),1) ))),
New Column( "B_1", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "GHI", floor(Random uniform( 4 )),1) ))),
New Column( "B_2", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "JKL", floor(Random uniform( 4 )),1) ))),
New Column( "point", Numeric, "Continuous", Format( "Best", 12 ), Formula( Row() ) ),
New Column( "avg", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal( 5 ) ) ),
New Column( "stddev", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal( 0.5 ) ) ),
New Column( "category", Character, "Nominal", Formula( Char( Floor( Row() / 101 ) ) ), Set Selected ),
New Column( "key", Character, "Nominal", Formula( Substr( "abcdefghijklmnopqrstufwxyz", floor(Random uniform( 27 )),1) )),
);
A_list = {};
B_list = {};
columnNames = As List(msr_dt << Get Column Names("String"));
For Each({colName},columnNames, // change here - note brackets
If(Contains(colName, "A_"),
Insert Into(A_list, colName)
);
If(Contains(colName, "B_"),
Insert Into(B_list, colName)
);
);
Eval(Eval expr(
Graph Builder(
Variables(
X( :point ),
Y( :avg ),
Y( :stddev ),
Page( :category ),
Color(B_list[1])
),
Show Control Panel( 0 ),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Legend( 27 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 29 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Legend( 28 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 31 ) )
),
Local Data Filter(
Conditional,
Add Filter(
columns( Expr( A_list || {"key"} ) ), //this needs to be evaluated before the graph builder function is called
Display( A_list[1], N Items( 7 ) ), //removed the find term
Display( A_list[2], N Items( 7 ) ),
Display( :key, N Items( 12 ) )
)
),
Column Switcher(
B_list[1], // added reference to specific column here - was the data table
B_list
)
)
));
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesJe suis novice en JSL, veuillez donc m'excuser si cette question a déjà été posée et répondue.
Je souhaite modifier le script Graph Builder ci-dessus afin de représenter graphiquement les colonnes IVP en fonction des colonnes NPN, les couleurs étant issues des colonnes PNP. Vous trouverez ci-joint le script modifié (Multiple Column Switcher.jsl) – comportant trois commutateurs de colonnes. Je dois actuellement sélectionner manuellement les combinaisons de colonnes IVP, NPN et PNP souhaitées. Sachant que les colonnes IVP, NPN et PNP sont toutes associées une à une (par exemple, IVP3 vs NPN3 et PNP3), comment puis-je utiliser un commutateur de colonnes unique pour effectuer cette association ?
Re: Script JSL pour l'attribution dynamique de colonnes dans un générateur de graphiquesJ'avais présenté une version simplifiée de ceci dans ma présentation de conseils et astuces lors du Discovery Summit ( Skip, Hop et JMP en une minute : Conseils JMP concis d'un super utilisateur (2026-EU-30MP-2767) , astuce « Sélecteurs de colonnes pour tous (Sélecteurs de colonnes multiples) »).
Voici une méthode assez simple pour y parvenir (notez que NPN possède plus de colonnes que les autres, il utilisera donc la colonne incorrecte dans ce cas).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << Get Column Names("String");
npn_cols = Filter Each({colname}, collist, Starts With(colname, "NPN"));
pnp_cols = Filter Each({colname}, collist, Starts With(colname, "PNP"));
ivp_cols = Filter Each({colname}, collist, Starts With(colname, "IVP"));
gb = dt << Graph Builder(
Variables(X(:NPN1), Y(:IVP1), Color(pnp_cols[1])),
Elements(
Position(1, 1),
Points(X, Y(1), Legend(27))
),
Elements(
Position(1, 2),
Points(X, Y(1), Legend(28)),
Line(X, Y(2), Y(3), Color(0), Legend(31))
)
);
cw1 = gb << Column Switcher(npn_cols[1], npn_cols);
cw2 = gb << Column Switcher(pnp_cols[1], pnp_cols);
cw3 = gb << Column Switcher(ivp_cols[1], ivp_cols);
Eval(EvalExpr(
post = Function({previousColumn, currentColumn, switcher},
c2 = Substitute((currentColumn << get name), "NPN", "PNP");
c3 = Substitute((currentColumn << get name), "NPN", "IVP");
Expr(cw2) << Set Current(c2);
Expr(cw3) << Set Current(c3);
);
));
handler = cw1 << Make Column Switch Handler(post);
// might want to hide other column switchers
cw_obs = (Report(gb) << Top Parent) << XPath("//ColumnSwitcherContextOutlineBox");
cws = cw_obs << Get Scriptable Object;
cw_obs[2] << Visibility("Collapse");
cw_obs[3] << Visibility("Collapse");
Write();
Les tableaux de données empilés et les filtres de données locaux peuvent également constituer une bonne option pour des choses comme celle-ci.