Bonjour,
Je trouve que l'écriture de scripts sur Graph Builder est une expérience brutale (j'écris des scripts JMP depuis un certain temps). Cela ne semble pas intuitif et je n'arrive pas non plus à trouver l'aide spécifique dont j'ai besoin. Alors j'agite mon drapeau blanc et je demande au groupe.
Mon script récupère les colonnes correctes (dont le nombre varie) et crée correctement un générateur de graphiques avec deux niveaux X imbriqués. Le problème est que bien que la première variable que je donne soit correctement des points, pour une raison quelconque, le générateur de graphiques attribue des boîtes à moustaches à toutes les autres variables (ce qui n'est visible nulle part dans mon script). Je cherche donc un moyen simple de transformer toutes mes variables y en points. Je soupçonne que cela implique de parcourir Elements en boucle, mais je serai sacrément si je peux trouver comment le faire correctement.
Pensées? De plus, quelqu'un a-t-il une bonne référence pour les scripts détaillés vers Graph Builder ?
TIA ! Fred
Oui. Je suis d'accord. C'est également mon approche pour l'apprendre, mais c'est incroyablement frustrant par rapport aux autres scripts. Un espace propice à davantage de discussions !
Merci pour l'aide. J'ai adopté l'approche suivante (par itération... beaucoup d'échecs !) :
1. J'ai une liste de noms de colonnes que je souhaite insérer dans le graphique. C'est dans la liste "a" (non illustrée). C'est ce que j'aimerais tracer.
2. Je crée une liste à partir des colonnes du tableau de données qui correspondent à ma liste de recherche. Ce sont les variables de l'axe Y existantes que je peux tracer.
3. Je crée un générateur de graphiques et définit mon axe X avec des variables imbriquées. Ceci est commun à toutes mes données.
4. Je parcours ensuite et j'ajoute les variables.
5. Ensuite, je parcours et ajoute les éléments.
6. Ensuite, je boucle et j'ajoute un quadrillage. Et puis enfin les titres.
Pour les étapes 4 à 6, je n'arrêtais pas de planter JMP si j'essayais de faire ces choses dans une seule boucle. C'est comme ça que j'en suis arrivé à ce point. Le script fonctionne (il a fallu extraire quelques éléments confidentiels mineurs), mais n'est pas rapide.
Comparé aux autres JSL que j'ai programmés, c'est plutôt compliqué. Je n'ai jamais eu autant de crashs de JMP. Mais ça marche.
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Les scripts JSL de Graph Builder ne sont pas faciles à comprendre.Mon approche consiste à modifier le graphique à ma guise, puis à cliquer sur le triangle rouge et à obtenir le script résultant.
Cependant, si vous disposez d'un nombre dynamique de variables Y, vous pouvez obtenir le script pour 2 ou 3 variables Y et étudier le script GB pour les modèles.Puis pour l'étendre à n Y variables, vous construirez dynamiquement une chaîne contenant le script gb à exécuter, puis l'exécuterez avec eval(parse(gb_string)).
Voici une façon d'utiliser des expressions. J'aime cette approche dans ce cas car j'ai un contrôle total et je peux créer l'intégralité de l'expression de lancement en une seule fois.
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
Je me rends compte que cette réponse n'est pas une solution complète. Vous n'avez pas donné suffisamment d'informations pour tenter une solution. Il est également préférable que vous appreniez à le résoudre vous-même. Il vise à illustrer une approche qui pourrait fonctionner pour vous.
Tracez-vous plusieurs colonnes dans le rôle Y ou utilisez-vous plusieurs objets Graph Builder, un pour chaque colonne ?
Eh bien, j'ai trouvé un peu de solution, mais c'est définitivement instable.
Je ai fini par:
- créer le graphique initial avec mes variables x imbriquées souhaitées, mais pas de variables Y.
- Ensuite, je lance une boucle pour ajouter les variables Y.
- Ensuite, j'ajoute une autre boucle pour supprimer l'élément pour chaque Y et j'ajoute un nouvel élément pour chaque Y qui a des points.
- Ensuite, j'ajoute une autre boucle pour ajouter des lignes de quadrillage pour chaque Y.
Presque chaque étape est séparée par un Wait(1). J'ai d'abord essayé une seule boucle pour chaque variable qui faisait chaque chose, et j'ai fait planter JMP complètement environ 10 fois jusqu'à présent. C'est mon dépannage qui m'a amené au formulaire ci-dessus.
Donc, ça marche, mais je n'aime certainement pas le crash de JMP s'il n'est pas codé correctement. Et j'apprécierais toujours que quelqu'un m'indique une référence solide pour les scripts Graph Builder. Merci d'avance!Fred