Comment scripter toutes les données X et Y sur un seul graphique de série chronologique dans l'application JMP ?Salut tout le monde,
Je développe une application JMP qui utilise l'intégration Python pour donner aux utilisateurs de l'application la flexibilité de charger n'importe quel fichier de données (Excel) contenant des données de processus industriel. Cette application comprend plusieurs fenêtres de modules et des scripts étendus.
Une chose que j'essaie de faire est de simplement tracer toutes les données d'un fichier de données chargé sur un graphique , où la première colonne est toujours le temps (X) et les colonnes restantes sont les variables de processus (Y). J'ai construit un module avec une boîte graphique pour l'afficher une fois l'application exécutée et les données chargées, mais j'ai du mal à créer un script pour cette fonctionnalité. Parce que je ne sais pas combien de colonnes il y aura dans un fichier de données donné, ni quel est leur titre, j'ai besoin que le script accepte automatiquement tous les Y (toutes les colonnes de données autres que la première) et les transmette à travers le graphique.
En jouant avec les différentes options graphiques de JMP, je n'ai pas réussi à faire en sorte que les graphiques de séries chronologiques affichent plusieurs tracés superposés, j'ai donc essayé d'écrire un script avec Graph Builder. Lorsque je trace manuellement les données dans Graph Builder, je peux sélectionner toutes les colonnes que je veux et les faire glisser sur Graph Builder Y et il s'affiche comme je le souhaite, avec toutes les données affichées sur un seul tracé. Cependant, lorsque j'essaie de créer un script, Graph Builder affiche uniquement la première variable Y que je transmets dans le script.
Je ne sais pas comment résoudre ce problème. Tous les conseils/autres suggestions sont grandement appréciés !
Merci!
-Estelle
PS S'il existe une autre façon de représenter graphiquement ces données de cette manière sans utiliser Graph Builder, veuillez me le faire savoir. Je préfère que cette application montre uniquement à l'utilisateur le résultat graphique et non toutes les fonctionnalités supplémentaires disponibles lors de l'utilisation de Graph Builder.
Automatisation et scriptsRe : Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?Merci beaucoup pour les informations utiles et les conseils. J'apprécie vraiment cela!
Re : Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?En combinant la solution moi et @txnelson fourni plus tôt, vous devriez pouvoir modifier le point/lissage et ainsi de suite. Créez d'abord le graphique avec JMP (pas besoin d'avoir toutes les colonnes sur l'axe y, vous pouvez en utiliser seulement deux). Je vais suivre le processus de développement de ce script (ce sera un peu long):
1. Ouvrez les exemples de données JMP. Dans ce cas, Semiconductor Capability.jmp, comme je le sais, comporte de nombreuses colonnes
2. Créez un graphique dans le générateur de graphiques avec une colonne comme axe X et deux comme axe Y

Prenez le scénario
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
)
3. Changez les points en ligne et je changerai également la statistique récapitulative de la valeur par défaut, afin que je puisse voir comment cela peut être changé dans le script

Prendre le scénario
Graph Builder(
Variables(X(:lot_id), Y(:NPN1), Y(:PNP1, Position(1))),
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
)
4. J'ai maintenant de bons scripts de base pour commencer à travailler dessus. Parce que je sais Re : Pouvez-vous construire ceci sans écrire d'expression dans une chaîne ? peut être utilisé pour résoudre ce problème, je l'utilise comme référence (script que j'ai fourni plus tôt).
Avec graphique de base :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);
Maintenant, si je voulais avoir Line au lieu de points, je vérifierais ce que je dois changer dans le script "line" que JMP m'a donné plus tôt. Fondamentalement, je vais devoir ajouter des éléments.
Elements(Line(X, Y(1), Y(2), Legend(4), Summary Statistic("Median")))
Heureusement, ceux-ci ont été ajoutés dans l'autre post
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
var_line = Expr(Line(X));
For Each({col, idx}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
yline_expr = Parse("Y("||char(idx)||")");
Insert Into(var_line, Name Expr(yline_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
Elements(yyy)
)
),
Expr(vvv), Name Expr(var_expr),
Expr(yyy), Name Expr(var_line)
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);

(Je n'ai pas modifié les statistiques récapitulatives, mais il devrait être assez facile de les modifier en insérant quelques expressions supplémentaires dans var_line avant la création du générateur de graphes)
yline_expr = Expr(Legend(6));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />yline_expr = Expr(Summary Statistic("Median"));<BR />Insert Into(var_line, Name Expr(yline_expr));<BR />
Sachant comment utiliser Expr, Substitute, NameExpr et ainsi de suite, j'ai appris à travers ces quelques messages dans la communauté Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute , Fonctions de gestion des expressions : Partie I - Démêler Expr(), NameExpr(), Eval(), ... Énigme et avec beaucoup, beaucoup d'essais et d'erreurs (je suis toujours confus avec eux, en particulier avec Name Expr)
Et enfin, si je devais combiner ce script avec le script que vous avez (je le nettoierais davantage, changerais l'ordre des expressions, pré-remplirais probablement les sélecteurs de colonne et fournirais peut-être une option pour sélectionner le type de graphique à utiliser, mais cela devrait donner une idée):
Voir plus... Re : Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?Merci pour la réponse et le conseil "<
Une chose que je ne vois/comprends pas, c'est comment spécifier si je veux que ce graphique utilise la ligne ou le lisseur et le point ou éventuellement une autre combinaison d'éléments de graphique, car je n'ai pas décidé ce qui est le mieux pour mon utilisation. Y a-t-il un moyen d'ajouter cela à cela?
Merci!
- Estelle
Re : Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?Merci pour la réponse! J'ai essayé d'utiliser le script généré par JMP et de l'ajuster, mais j'ai toujours ce problème. Vous trouverez ci-dessous un script sur lequel j'ai travaillé pour voir quels résultats je peux obtenir :
//the data table you want to operate on
datafile = Open( "Data.xlsx");
//number of columns in the data table
numcol = ncol(datafile);
selectorwindow = New Window("Column Selector", /*<<MODAL></MODAL>);Je pense que l'un de mes problèmes peut être que je ne sais pas exactement comment spécifier la partie "Éléments" pour accepter n'importe quel nombre de Y. Pour ce script spécifique, peu importe si j'ajoute plus d'éléments (Ligne (Y(1), Y(2), Y(3), etc.)) et change les colonnes que je sélectionne comme Y, je n'obtiens toujours qu'une seule variable tracée.
Merci!
- Estelle
Re : Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?Il semble que vous génériez votre JSL à partir de zéro... comme le ferait un programmeur Python, plutôt que de prendre le Graph Builder interactif que vous avez produit, puis de laisser JMP générer le JSL qui créera le graphique.Si je crée interactivement le graphique ci-dessous,

En allant dans le triangle rouge et en sélectionnant "Script", cela produit un script qui gère les deux variables de l'axe Y
Graph Builder(
Size( 528, 448 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y( :height ), Y( :weight, Position( 1 ) ) ),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
5,
Base( 0, 0, 0, Item ID( "height", 1 ) ),
Base( 1, 0, 0, Item ID( "weight", 1 ) )
)}
)
)
);
Maintenant, si votre problème est que lorsque vous prenez un script comme celui ci-dessus et que vous essayez de l'étendre pour gérer autant de colonnes Y que vous en avez besoin, cela peut parfois nécessiter un peu plus de travail.
Voici la même structure d'un graphique, mais avec beaucoup plus de colonnes Y

Voici le JSL étendu que JMP a produit pour recréer le graphique
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
Graph Builder(
Size( 528, 458 ),
Show Control Panel( 0 ),
Variables(
X( :Wafer ID in lot ID ),
Y( :NPN1 ),
Y( :PNP1, Position( 1 ) ),
Y( :PNP2, Position( 1 ) ),
Y( :NPN2, Position( 1 ) ),
Y( :PNP3, Position( 1 ) ),
Y( :IVP1, Position( 1 ) ),
Y( :PNP4, Position( 1 ) )
),
Elements(
Points(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 3 )
),
Smoother(
X,
Y( 1 ),
Y( 2 ),
Y( 3 ),
Y( 4 ),
Y( 5 ),
Y( 6 ),
Y( 7 ),
Legend( 4 )
)
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "NPN1", 1 ) ),
Base( 1, 0, 0, Item ID( "PNP1", 1 ) ),
Base( 2, 0, 0, Item ID( "PNP2", 1 ) ),
Base( 3, 0, 0, Item ID( "NPN2", 1 ) ),
Base( 4, 0, 0, Item ID( "PNP3", 1 ) ),
Base( 5, 0, 0, Item ID( "IVP1", 1 ) ),
Base( 6, 0, 0, Item ID( "PNP4", 1 ) )
)}
)
)
);
C'est là que le programmeur JSL doit créer la chaîne de commande à exécuter pour passer à Graph Builder.Si vous le faites déjà et que vous n'obtenez que la 1ère variable Y dans le graphique, ce qui se passe généralement, c'est que Graph Builder n'est pas en mesure d'évaluer les informations qui lui sont transmises.Si vous fournissez le JSL que vous utilisez, la communauté est généralement assez bonne pour vous aider.
Re : Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?Ce sujet pourrait être utile :
Re : Pouvez-vous construire ceci sans écrire d'expression dans une chaîne ?
Beaucoup d'expressions ici, vous pouvez également utiliser << Obtenir une image pour "supprimer des fonctionnalités" du générateur de graphiques
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
x_col = Column(dt, 1);
y_cols = (dt << Get Column Names())[5::N Cols(dt)];
var_expr = EvalExpr(
Variables(X(Expr(x_col))
));
For Each({col}, y_cols,
y_expr = Expr(Y(Position(1)));
Insert Into(y_expr, NameExpr(col), 1);
Insert Into(var_expr, Name Expr(y_expr));
);
gb = Eval(Substitute(
Expr(
gb = dt << Graph Builder(
Size(838, 391),
Show Control Panel(0),
vvv,
)
),
Expr(vvv), Name Expr(var_expr),
));
gb_image = gb << get picture;
gb << Close Window;
New window("test",
gb_image
);