Envoi vers des graphiques empilés générés dynamiquementSalut tout le monde,
J'essaie de générer un rapport dans lequel j'ai 2 graphiques par "paramètre" pour la médiane et le stdev, et j'ai du mal à y ajouter des lignes.
Le fichier "Summary.jmp" contient plusieurs colonnes avec un "Lot" (je l'utilise comme axe X), puis plusieurs paramètres, chacun d'eux ayant une colonne pour la médiane avec le suffixe "_Q50" et une avec le suffixe "_StdDev" .
J'ai une liste de paramètres qui ont en plus Target, LowerSpecsLimit et UpperSpecsLimits (TGT, LSL, USL). Je ne les ai pas directement dans les colonnes car ils peuvent changer en fonction de l'ensemble "Lot" que je sélectionne et je préférerais en fait ne pas toucher du tout au fichier, pour m'assurer de ne pas laisser de désordre si le script échoue pour quelque raison que ce soit.
J'ai aussi Dispatch pour remplacer les titres et étiquettes des axes.
J'ai ensuite une fonction qui génère les graphiques médian et stdev les uns sur les autres, les graphiques sont corrects.
Mais peu importe ce que je mets dans la section expédition, j'obtiens une erreur
"Impossible de trouver ScaleBox ... à {}"
et toute la répartition de TextEditor semble ne rien faire (pas même une erreur, mais je suppose que la fonction s'arrête à la première erreur de répartition ?)
J'ai généré les graphiques et apporté des modifications manuelles pour vérifier le script résultant, et cela n'a pas aidé. Il utilise "Param1_Q50" directement, et même ça ne marche pas quand je le remets dans le script !
Voici le code :
NamesDefaultToHere(1);
Open("Summary.jmp");
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {
{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}
};
ParamGraph = Function (
{parameter, title, tgt=".", lsl=".", usl="."},
LOCAL(
{Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
gb = Graph Builder(
Size(GraphXSize,GraphYSize),
Show Control Panel(0),
Show Footer(0),
Show Legend(0),
Variables(
X(:Name("Lot")),
Y(Column(medianCol)),
Y(Column(stdevCol)),
Color(:Lot)
),
Elements(
Points(X, Y, Legend(6))
),
SendToReport(
Dispatch(
{},
medianCol,
ScaleBox,
{IF(tgt != ".", Add Ref Line(tgt, "Solid", "Black", "TARGET", 1)),
IF(lsl != ".", Add Ref Line(lsl, "Solid", "Purple", "LSL", 1)),
IF(usl != ".", Add Ref Line(usl, "Solid", "Red", "USL", 1))}
),
Dispatch({}, "graph title", TextEditor, {Set Text(title)}),
Dispatch({}, "Y title", TextEditor, {Set Text("Median")}),
Dispatch({}, "Y 1 title", TextEditor, {Set Text("Std Dev")})
),
);
);
);
New Window("Summary - Report",
For(i=1, i<=Length(ParamsList), i++,
ParamGraph(ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5])
)
) << Set Window Icon("Trellis")
J'ai même essayé de remplacer medianCol dans la section Dispatch par "Param1_Q50", pour voir s'il s'agissait d'un problème de substitution, en m'attendant à ce que le premier graphique obtienne les lignes et pas les autres, mais... ça n'a pas marché !
J'ai aussi essayé d'obtenir une référence au rapport
rgb = gb << report;
rgb[TextEditBox(5)] << Set Text("Median");
Mais j'obtiens à nouveau un message d'erreur :
Cannot subscript Display Box in access or evaluation of 'Subscript' , rgb[/*###*/"TextEditor"]
Est-ce que quelqu'un sait comment je peux aborder les éléments de ces graphiques ??
Merci d'avance!!
Re : Envoi vers des graphiques empilés générés dynamiquement
Re : Envoi vers des graphiques empilés générés dynamiquementSalut Jim,
En effet, ça marche !
J'ai copié manuellement vos modifications et j'ai fait 2 erreurs :
1. Je n'avais pas réalisé que les lignes "Element" étaient obligatoires
2. J'ai écrit "Parse(title)" au lieu de title
Et je préfère de loin votre solution (code plus propre et sans "résidu").
Merci beaucoup!
Re : Envoi vers des graphiques empilés générés dynamiquementJ'ai exécuté mon script avec votre tableau récapitulatif sous JMP 12.2 et il s'est exécuté sans erreur. Ci-dessous le script qui comprend votre tableau récapitulatif, et mon script retravaillé
Names Default To Here( 1 );
//Open("Summary.jmp");
dtsumm = New Table( "Summary",
Add Rows( 6 ),
New Column( "Lot",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5, 6] )
),
New Column( "Param1_Q50",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [-3, 7, 8, -12, 5, 0] )
),
New Column( "Param1_StdDev",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0.2, 1, 0.6, 2, 0.2, 0.3] )
),
New Column( "Param2_Q50",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [23, 18, 54, 62, 78, 45] )
),
New Column( "Param2_StdDev",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0.9, 1.2, 7, 3.6, 4.2, 1] )
)
);
// Run the script
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}};
ParamGraph = Function( {parameter, title, tgt = ., lsl = ., usl = .},
Local( {Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
Eval(
Substitute(
Expr(
gb = dtSumm << Graph Builder(
Size( __GraphXSize__, __GraphYSize__ ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Footer( 0 ),
Variables( X( :lot ), Y( __Q50__ ), Y( __Std__ ), Color( :lot ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( __title__ )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Median" )} ),
Dispatch( {}, "Y 1 title", TextEditBox, {Set Text( "Std Dev" )} )
)
)
),
Expr( __GraphXSize__ ), GraphXSize,
Expr( __GraphYSize__ ), GraphYSize,
Expr( __Q50__ ), Parse( MedianCol ),
Expr( __Std__ ), Parse( stdevCol ),
Expr( __Title__ ), title
)
);
If( Is Missing( tgt ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( tgt, "Solid", Black, "TARGET", 1 )
);
If( Is Missing( lsl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( lsl, "Solid", Purple, "LSL", 1 )
);
If( Is Missing( usl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( usl, "Solid", Red, "USL", 1 )
);
)
);
New Window( "Summary - Report",
For( i = 1, i <= Length( ParamsList ), i++,
ParamGraph( ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5] )
)
) << Set Window Icon( "Trellis" );Re : Envoi vers des graphiques empilés générés dynamiquementSalut Jim,
Je l'ai essayé sur mon fichier ref summary.jmp, et ...
Cannot find TextEditBox[ "graph title" ] at {}
Cannot find TextEditBox[ "Y title" ] at {}
Cannot find TextEditBox[ "Y 1 title" ] at {}
Cannot subscript Display Box in access or evaluation of 'Subscript' , Report( gb )[/*###*/AxisBox( 3 )]
Donc, s'il s'agit d'un bogue, je dois mentionner que je suis sur JMP 12.1.0 64bits.
Mais de toute façon, cela fonctionne avec mon code (sale), donc je vais m'en occuper. J'aurai juste une tonne de fenêtres arborescentes à fermer...
Re : Envoi vers des graphiques empilés générés dynamiquementJe pense que vous trouverez dans cet exemple une manière plus simple de gérer ce que vous voulez
Je ne suis pas sûr que le format final soit exactement correct, mais je pense que vous pouvez facilement le modifier pour répondre à vos besoins
Names Default To Here( 1 );
//Open("Summary.jmp");
// Create a Sample data table
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
dt:npn1 << delete property( "spec limits" );
dt:pnp1 << delete property( "spec limits" );
dt:npn1 << set name( "Param1" );
dt:pnp1 << set name( "Param2" );
dt:lot_id << set name( "lot" );
dtSumm = dt << Summary(
Group( :lot ),
Median( :Param1 ),
Std Dev( :Param1 ),
Median( :Param2 ),
Std Dev( :Param2 ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column stat" )
);
dtSumm:Param1 Median << set name( "Param1_Q50" );
dtSumm:Param2 Median << set name( "Param2_Q50" );
dtSumm:Param1 Std Dev << set name( "Param1_StdDev" );
dtSumm:Param2 Std Dev << set name( "Param2_StdDev" );
// Run the script
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}};
ParamGraph = Function( {parameter, title, tgt = ., lsl = ., usl = .},
Local( {Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
Eval(
Substitute(
Expr(
gb = dtSumm << Graph Builder(
Size( __GraphXSize__, __GraphYSize__ ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Footer( 0 ),
Variables( X( :lot ), Y( __Q50__ ), Y( __Std__ ), Color( :lot ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 6 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( __title__ )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Median" )} ),
Dispatch( {}, "Y 1 title", TextEditBox, {Set Text( "Std Dev" )} )
)
)
),
Expr( __GraphXSize__ ), GraphXSize,
Expr( __GraphYSize__ ), GraphYSize,
Expr( __Q50__ ), Parse( MedianCol ),
Expr( __Std__ ), Parse( stdevCol ),
Expr( __Title__ ), title
)
);
If( Is Missing( tgt ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( tgt, "Solid", Black, "TARGET", 1 )
);
If( Is Missing( lsl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( lsl, "Solid", Purple, "LSL", 1 )
);
If( Is Missing( usl ) == 0,
report(gb)[AxisBox( 3 )] << Add Ref Line( usl, "Solid", Red, "USL", 1 )
);
)
);
New Window( "Summary - Report",
For( i = 1, i <= Length( ParamsList ), i++,
ParamGraph( ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5] )
)
) << Set Window Icon( "Trellis" );
Re : Envoi vers des graphiques empilés générés dynamiquementAprès pas mal d'essais et d'échecs, j'ai réussi à le faire (pas très intuitif !)
Donc, je n'ai pas utilisé SendToReport, mais j'ai utilisé l'indice.
Si je l'ai dans la fonction, cela ne fonctionne pas. J'ai dû le retirer :
NamesDefaultToHere(1);
Open("Summary.jmp");
GraphXSize = 800;
GraphYSize = 600;
ParamsList = {
{"Param1", "Name1", 0, -10, 10},
{"Param2", "Name2", 50, 25, 75}
};
ParamGraph = Function (
{parameter, title, tgt=., lsl=., usl=.},
LOCAL(
{Default Local},
medianCol = parameter || "_Q50";
stdevCol = parameter || "_StdDev";
return = Graph Builder(
Size(GraphXSize,GraphYSize),
Show Control Panel(0),
Show Footer(0),
Show Legend(0),
Variables(
X(:Name("Lot")),
Y(Column(medianCol)),
Y(Column(stdevCol)),
Color(:Lot)
),
Elements(
Points(X, Y, Legend(6))
)
);
);
);
wind = New Window("Summary - Report",
For(i=1, i<=Length(ParamsList), i++,
gb= ParamGraph(ParamsList[i][1], ParamsList[i][2], ParamsList[i][3], ParamsList[i][4], ParamsList[i][5]);
rgb = gb << report;
rgb << showtreestructure;
IF(
IsMissing(ParamsList[i][3]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][3], "Solid", "Black", "TARGET", 1);
);
IF(
IsMissing(ParamsList[i][4]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][4], "Solid", "Purple", "LSL", 1);
);
IF(
IsMissing(ParamsList[i][5]) == 0,
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderAxisBox(2)] << Add Ref Line(ParamsList[i][5], "Solid", "Red", "USL", 1);
);
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(1)] << Set Text(ParamsList[i][2]);
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(3)] << Set Text ("Median");
rgb[PictureBox(1), GraphBuilderBox(1), GraphBuilderTitleBox(4)] << Set Text ("Standard Deviation");
)
) << Set Window Icon("Trellis");
Notez également la ligne :
rgb << showtreestructure;
Si je ne l'ai pas, ça ne marche pas !
Et c'est assez embêtant puisque je ne sais pas comment le fermer automatiquement après, mais au moins, ça marche maintenant !
Re : Envoi vers des graphiques empilés générés dynamiquementSalut Jim,
Merci! J'ai fait la correction, mais cela n'a pas résolu mon problème.
Impossible de trouver ScaleBox["medianCol"] à {}
ou si je le code en dur":
Impossible de trouver ScaleBox["Param1_Q50"] à {}
Notez que si je supprime le deuxième graphique de l'axe Y, les lignes de référence fonctionnent soudainement, mais pas les titres et les axes renommés.
Re : Envoi vers des graphiques empilés générés dynamiquementMerci - on dirait que Jim vous a couvert
Re : Envoi vers des graphiques empilés générés dynamiquementSalut David,
Voici un résumé.jmp.
Re : Envoi vers des graphiques empilés générés dynamiquementVous avez une incompatibilité dans les types de données pour vos limites. Le "Ajouter une ligne de référence" nécessite que la valeur de la ligne (première valeur) soit une valeur numérique. Dans votre fonction, vous le définissez sur une chaîne de caractères.
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ".", usl = "."}
et dans votre instruction If
If( tgt != ".",
La liste des éléments doit être changée en numérique
ParamGraph = Function( {parameter, title, tgt = ".", lsl = ., usl = .}
et l'instruction If doit être remplacée par :
If( IsMissing(tgt) == 0,
Re : Envoi vers des graphiques empilés générés dynamiquementIl serait beaucoup plus facile de vous aider si vous pouviez nous fournir un code que nous pouvons exécuter. Cela signifie soit fournir la table "summary.jmp", soit réécrire le code pour qu'il fonctionne avec l'un des exemples de tables de données fournis avec JMP.