Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Salut la communauté !
Pendant des siècles, j'ai eu un script dans lequel je dessinais des graphiques bivariés dans un groupe d'ajustement, comme ceci :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
L'essentiel ici est que j'obtiens une liste de paramètres sous la forme d'une liste de chaînes, puis je les trace un par un.
Maintenant, je dois passer de Bivariate Plot à Graph Builder en raison de certaines fonctionnalités que Graph Builder possède et que Bivariate n'a pas.
J'ai trouvé comment faire en sorte que le tracé du générateur de graphiques ressemble exactement à celui d'un graphique bivarié, mais je ne vois pas s'il existe un moyen simple de représenter les Go dans un groupe d'ajustement comme ci-dessus. Il semble que le groupe d'ajustement puisse prendre en compte les Go comme suit :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
Mais pour une liste arbitraire de paramètres, je dois l'écrire en boucle. J'espérais quelque chose de plus simple, comme (évidemment, ça ne fonctionne pas) :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
Existe-t-il un moyen pour GB de prendre une liste de paramètres et de générer une liste de DisplayBoxes ?
Automatisation et scriptsRe : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Vous étiez assez proche. Il vous faut écrire un script en boucle. Ce qui suit semble fonctionner. Vous pouvez remplacer la liste des colonnes par une sortie d'interface graphique ou, si vous n'êtes pas à l'aise avec les scripts d'interface graphique, écrire un script pour « obtenir les colonnes sélectionnées », sélectionner les colonnes à tracer, puis convertir le résultat en liste par programmation.
L'interactivité est la force du générateur de graphiques. Cela le rend moins optimal pour afficher plusieurs tracés dans une fenêtre, car chacun d'eux devrait être modifié (si tant est qu'il le soit), mais les scripts simplifient (plus ou moins) la tâche.
Une méthode que j'utilise consiste à utiliser un script qui génère des sorties vers plusieurs plateformes, notamment y par x et GB. Il génère également le sélecteur de colonnes. Un bouton permet ensuite de tracer chaque sortie de la liste du sélecteur de colonnes dans un journal. Bien sûr, aucune interactivité n'est disponible.
en tout cas, voici le script légèrement modifié
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Pour Graph Builder, vous utiliseriez Page pour obtenir un effet similaire, mais cela nécessite évidemment que vos données soient dans un format spécifique. Ou le sélecteur de colonnes.
Si vous ne pouvez pas utiliser Page, je vous conseille d'abandonner Fit Group pour Graph Builder. Regroupez les graphiques dans Lineup Box afin de les regrouper facilement en lignes.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
Si vous souhaitez pouvoir modifier le nombre de rapports dans chaque ligne, vous pouvez le faire avec Lineup Box
<< N Col(1);
Vous pouvez ajouter des scripts à la zone de contour de niveau le plus élevé si nécessaire.
Si vous souhaitez utiliser Fit Group, vous pouvez le faire, mais cela nécessite une certaine gestion des expressions. Vous pouvez également créer une fonction qui le fera pour vous si vous devez le faire souvent.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Les contraintes que j'ai sont les suivantes :
Ce script fait partie d'un module complémentaire. Il prend actuellement en entrée une liste de colonnes dans une chaîne de texte (générée via l'interface graphique).
Et je n'ai pas besoin d'interactivité, j'ai besoin d'un format précis des tracés qui a été convenu avec le client.
Je passe à GB, car apparemment, Fit Y by X ne propose pas de méthode simple pour afficher les barres d'erreur. Le client souhaite soudainement que les barres d'erreur apparaissent sur le graphique.
La question est de savoir quelle est la méthode la plus efficace pour produire une liste de Go plutôt qu'un seul Go. J'espérais une fonctionnalité non documentée permettant de le faire de la même manière que pour « Ajuster un groupe » et « Ajuster Y par X ».
Mais il semble que je vais devoir écrire des boucles de script.
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Je pense que je vais devoir passer à Line Up Box. Je ne voulais pas le faire, car cela nécessiterait des modifications de code plus invasives, mais je n'aime pas vraiment les expressions de script. J'espère seulement que :
1. Je n'utilise aucune fonctionnalité spécifique de ce groupe Fit ailleurs dans le code
2. Je pourrai le faire ressembler exactement à Fit Group dans la sortie.
Je vais cependant montrer un exemple de code du résultat final.
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Une question pour toi.
Votre script fonctionne parfaitement bien après avoir corrigé une faute de frappe évidente :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
qui s'ajoute ensuite très bien à « lub ».
J'ai réécrit le premier script que vous avez suggéré sous une forme légèrement différente :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
dans mon cas, « listOfGBs » s'affiche également comme :
{Graph Builder[], Graph Builder[]}
mais ensuite en ligne :
lub << Append( listOfGBs );
cela génère une erreur :
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
Une idée pourquoi ?
Je vais essayer de jouer avec, mais j'aimerais garder GB dans une fonction.
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Votre script cesse de fonctionner dès que je fais cela :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
D'un point de vue sémantique, il ne devrait pas y avoir de différence si j'utilise directement une expression du Générateur de graphes ou si j'ai une variable pour la représenter ; c'est ce que j'ai compris. Pourquoi cela perturbe-t-il le script ?
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Ok, ça marche sous cette forme :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
Je peux utiliser à la fois la fonction (à ma façon) et l'expression (effectivement à votre façon) ;
Je ne sais pas quel était le problème précédent, mais apparemment, je dois créer LineUp Box à l'intérieur de la fonction et le renvoyer plutôt qu'un objet GB.
Re : Remplacement de « Bivarié » par « Générateur de graphiques » dans un « Groupe d'ajustement »Vous ajoutez une liste, et non des outils de création de graphiques, à la zone de composition. Je modifierais votre script comme suit :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
Il faut être prudent lors de la création des graphiques. On peut généralement éviter ce problème en jouant avec les expressions, mais cela nécessitera de les créer. De plus, si vous n'avez pas besoin de collecter les références, ce sera plus simple, car vous n'aurez pas besoin de l'option « Insérer dans ». Vous pourrez les récupérer ultérieurement avec << XPath.
Voir plus...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;