Comment créer un script pour toutes les données X et Y dans un seul graphique de séries chronologiques dans JMP Application ?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 dans n'importe quel (Excel) fichier de données avec des données de processus industriels. Cette application comprend plusieurs fenêtres de module et des scripts étendus.
Une chose que j'essaie de faire est de tracer simplement 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 que l'application s'exécute et que les données sont chargées, mais j'ai du mal à écrire cette fonctionnalité. Parce que je ne sais pas combien de colonnes seront dans un fichier de données donné, ni 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 été en mesure d'obtenir des graphiques de séries chronologiques pour afficher plusieurs tracés superposés, j'ai donc essayé de créer des scripts 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 le Graph Builder Y et cela 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 n'affiche que la première variable Y que je passe 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 un autre moyen de représenter graphiquement ces données de cette manière sans utiliser Graph Builder, veuillez m'en informer. Je préfère que cette application ne montre à l'utilisateur que le résultat graphique et non toutes les fonctionnalités supplémentaires disponibles lors de l'utilisation de Graph Builder.
GraphiqueScriptRe : 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...
Names Default To Here(1);
//the data table you want to operate on
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//number of columns in the data table
numcol = N Col(dt);
selectorwindow = New Window("Column Selector",
<<MODAL></MODAL>
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
);