J'ai un code "sample.jsl" qui a une boucle pour créer un tracé bi-var pour chaque colonne. J'essaie d'ajouter une zone de curseur de plage à cette boucle afin qu'une fois que j'ai exécuté le script, il crée un graphique pour toutes les colonnes avec une zone de curseur de plage distincte pour chaque graphique.
Les limites pour toutes les colonnes de l'axe des x sont dans "limits.jmp" et le fichier de données est "Data.jmp". Le code "sample.jsl" crée un graphique chacun pour tous les paramètres à la fois. Je souhaite modifier le code afin qu'il ajoute également une zone de curseur de plage à tous les graphiques.
La zone de curseur de plage doit avoir les limites de contrôle supérieures (ucl) et lcl comme deux curseurs dynamiques.
J'ai ce code qui crée la zone de curseur de plage, mais cela ne fonctionne que pour un seul graphique. J'ai besoin d'un script qui crée tous les graphiques avec les curseurs de plage dynamique.
Toute aide serait appréciée. Merci d'avance
myFinalDisplay = expr(
myLimitCol = column(dt, "ColA"); //new
myLimitMin = colMinimum(myLimitCol); show(myLimitMin); //new
myLimitMax = colMaximum(myLimitCol); show(myLimitMax); //new
mylcl = globalLCL["ColA];
myucl = globalUCL["ColA];
myGbDispObj = dt << Bivariate(
Size( 550, 400 ),
Y( "res" ),
X( "ColA" ),
Automatic Recalc( 1 ),
Histogram Borders( 1 ),
Summary Statistics( 1 ),
Fit Spline( 2, {Line Color( {212, 73, 88} )} ),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Row Legend(
"Grouping",
Color( 1 ),
Color Theme( "JMP Default" ),
Marker( 1 ),
Marker Theme( "Solid" ),
Continuous Scale( 1 ),
Reverse Scale( 0 ),
Excluded Rows( 0 )
)}
),
Dispatch(
{},
"1",
ScaleBox,
{Add Ref Line({mylcl, myucl}, "Solid", "Light YellowGreen", "", 1, 0.20 )}
),
Dispatch( {}, "Summary Statistics", OutlineBox, {Close( 1 )} )
)
);
myTbLo = textBox(Char(round(myLimitMin, 2)) || " (OOC = " || char(0.00, 10, 2) || "%)");
myTbHi = textBox(Char(round(myLimitMax, 2)) || " (OOC = " || char(0.00, 10, 2) || "%)");
mySbDispObj = rangeSliderBox();
mySbDispObj = rangeSliderBox(
myLimitMin,
myLimitMax,
mylcl,
myucl,
//script
mySelectedLower = mySbDispObj << getLower;
mySelectedUpper = mySbDispObj << getUpper;
myGbDispObj << Dispatch( {}, "1", ScaleBox, {Add Ref Line( mySelectedLower, "Dashed", "blue", "LCL", 4 )} );
myGbDispObj << Dispatch( {}, "1", ScaleBox, {Add Ref Line( mySelectedUpper, "Dashed", "blue", "UCL", 4 )} );
rUpper = dt << Get Rows Where( myLimitCol[] > mySelectedUpper );
OOC_valUpper = (N Items(rUpper) / Col Number( Column(dt, "ColA") ))*100;
myTbHi << setText(Char(round(mySelectedUpper, 1)) || " (OOC = " || char(OOC_valUpper, 10, 2) || "%)");
rLower = dt << Get Rows Where( myLimitCol[] < mySelectedLower );
OOC_valLower = (N Items(rLower) / Col Number( Column(dt, "ColA") ))*100;
myTbLo << setText(Char(round(mySelectedLower, 1)) || " (OOC = " || char(OOC_valLower, 10, 2) || "%)");
);
mySbDispObj << Set Width( 275 );
myLayout = vListBox(
myGbDispObj,
hListBox(myTbLo, spacerBox(size(50,0)), myTbHi),
mySbDispObj
);
);@pmroz
@txnelson
Merci d'avoir expliqué cela.
Oui, je suis expérimenté en python et novice en jsl. Apprendre en déplacement.
OP, cela peut être fait relativement facilement, mais je ne pense pas que beaucoup de gens voudront vous aider car vous en demandez trop et semblez trop inexpérimenté pour vraiment tout comprendre.
Certaines choses à examiner pendant que vous remplissez votre niveau d'expérience sont les suivantes
- JSL ne fait pas vraiment beaucoup de contrôle automatique de la portée - en particulier, il ne se souvient pas des états de portée et des hiérarchies pour les fonctions et autres - si vous êtes habitué à Python par exemple, alors JSL sera assez frustrant et vous causera beaucoup douleur jusqu'à ce que vous intériorisez cela et que vous commenciez à faire tout votre propre contrôle de portée
- Pour plusieurs interactif et la plupart du temps des éléments identiques (comme des graphiques avec des curseurs, où seul le graphique X/Y / Grouping change), les expressions ne vous serviront pas bien.Utilisez plutôt un générateur de fonctions ou quelque chose comme vous aurez besoin de distinguer les boîtes de curseur et l'objet auquel elles sont liées.Bien sûr, cela peut être fait avec des expressions, mais en général, c'est la configuration la plus compliquée avec des gains de vitesse négligeables dans la plupart des cas.
- Commencez petit, avec un seul graphique et un rangeSliderBox.Apprenez à les lier à l'aide d'une portée explicite
- Vous aurez besoin d'une table de données distincte pour chaque parcelle car une table ne peut avoir qu'un seul état de ligne par ligne
- Avec cela, si vous créez plusieurs sous-tables pour chaque parcelle, il serait préférable de les rendre invisibles pour éviter que l'utilisateur ne soit inondé de tables de données.Mais gardez à l'esprit que le tableau de données ne sont jamais implicitement supprimés par JMP .Vous devez lier la fermeture de la fenêtre au nettoyage du script - fermez toutes les tables de données pertinentes et supprimez tous les espaces de noms utilisés pour la portée.
- De nombreuses personnes sur les pages de la communauté ici sont prêtes à aider, mais les questions doivent être courtes et succinctes.
En voici un exemple affectant certaines lignes de référence avec un sliderbox pour chaque liste. Cela ne supprime pas la ligne de référence précédente, vous devez donc déterminer comment vous voulez le faire si c'est ce que vous recherchez.
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age)); // just some list
nw = new window("Some box");
for(i=1, i<=nitems(ages), i++,
olb = outlinebox("Age = " || char(ages[i]),
hlistbox(
rsb = rangesliderbox(colmin(:height), colmax(:height), colquantile(:height, .25), colquantile(:height, .75)),
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
where(char(:age) == ages[i])
);
)
);
(gb<<PARENT></PARENT>Les graphiques fonctionnent bien et s'ajoutent dans la nouvelle fenêtre. Mais je ne suis pas en mesure d'ajouter un objet range slider box() à chacun des graphiques créés à l'aide de la boucle ;.
Vous pouvez essayer de créer d'abord une fenêtre avec une zone de liste vide dans laquelle vous souhaitez placer les graphiques, puis ajouter vos graphiques à cette zone de liste à l'aide d'une boucle for.
Je pense que le message que vous avez posté ne s'affiche pas ?