JMP 17.2.0
MODIFIER : Exemple de fichier de données téléchargé avec le message principal.
J'ai rencontré un léger problème en essayant de personnaliser mes graphiques, que ce soit via le générateur de graphiques ou via JSL (ou une combinaison des deux). J'ai parcouru les forums JMP et trouvé des sujets similaires, mais aucune solution ne correspond réellement à ce que je souhaite faire.
Ce que je souhaite que JMP fasse est : coder mes marqueurs par couleur selon le numéro de test (ou dans le code, RUN_NUM), choisir différentes formes de marqueurs par numéro de test, puis tracer une droite d'ajustement quadratique pour chaque numéro de test, la couleur de la droite correspondant à celle des marqueurs et toujours en pointillés. Il est également important de noter que je ne souhaite pas attribuer de couleurs permanentes à des tests spécifiques à l'aide d'une fonctionnalité comme la couleur des états de ligne. Je souhaite que le graphique utilise le même schéma de couleurs, quels que soient les numéros de test tracés, car ces données font partie d'une table de données croissante pouvant contenir entre 100 et 200 tests. Par exemple, si je trace les tests 1 à 5, je souhaite qu'ils soient toujours tracés selon un schéma de couleurs comme bleu, rouge, vert, orange, violet, afin que si je modifie le tracé, par exemple les tests 1 à 4 + le test 7, le schéma de couleurs soit le même pour les cinq tests tracés.
J'arrive à obtenir presque toutes les fonctionnalités ci-dessus, mais je ne parviens pas à faire correspondre le code couleur des marqueurs et la ligne d'ajustement. Voici mon processus jusqu'à présent dans Graph Builder/JSL :
- Je trace mes points de données en Go, généralement quatre points de données par test.
- Je fais glisser « numéro de test » vers l'espace « superposition » en GB. Cette couleur code mes points de données par test.
- Je fais glisser « Numéro de test » vers l'espace « Couleur » en Go. Cela permet de choisir une forme pour chaque test.
- Je clique sur l'option de ligne d'ajustement qui ajoute la ligne au graphique, mais ils ont des styles de ligne différents et la couleur est toujours le bleu par défaut JMP.
En suivant les étapes ci-dessus, je suis proche du résultat, mais pas encore tout à fait. Grâce aux forums JMP, j'ai trouvé un bon moyen d'ajouter du JSL pour modifier le style et/ou la couleur des lignes, mais pas les deux simultanément. Je peux enregistrer mon graphique GB, puis modifier légèrement le JSL pour obtenir l'un ou l'autre.
Remarque : dans le code ci-dessous, numéro de test = RUN_NUM
En ajoutant ceci en haut de mon code graphique :
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
Et en ajoutant ceci au bas de mon code graphique :
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
})));
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
})));
Je peux utiliser le code ci-dessus pour modifier la ligne des propriétés d'ajustement. Cependant, j'ai découvert quelques anomalies.
- Tel quel, le code ci-dessus modifie le style de ligne en pointillé pour chaque ligne d'ajustement
- Tel quel, le code ci-dessus modifie la largeur de ligne pour chaque ligne d'ajustement
- Tel quel, toutes les lignes d'ajustement sont colorées en noir pour une raison quelconque
C'est presque tout ce que je voulais, sauf que les lignes sont noires. Prochaine particularité :
- Si je supprime « numéro de test » de la propriété « couleur » dans GB, toutes mes lignes d'ajustement correspondent désormais à la couleur du marqueur et changent dynamiquement à chaque test sélectionné ! Elles sont également toutes en pointillés et ont la bonne largeur.
- Désormais, mes marqueurs sont tous des cercles au lieu de formes uniques qui changent lors de la sélection de différents tests et ils ignorent la taille de marqueur spécifiée dans le code.
Maintenant, j'ai tout compris, sauf la forme du marqueur. C'est là que je bloque. Il semble que je doive vivre avec l'une des deux issues suivantes :
- Tout ce que je veux, sauf les lignes de coupe, sont toujours des lignes noires
- Tout ce que je veux, à l'exception des formes de marqueurs, sont toujours des cercles (et petits)

Quelqu'un connaît-il un moyen d'obtenir tout ce que je souhaite pour un graphique personnalisé ? Peut-être que je ne comprends pas bien quelque chose ? Toute aide est la bienvenue.
Quelques discussions pertinentes précédentes sur JMP :
- https://community.jmp.com/t5/Discussions/Match-Line-Color-of-Normal-Quantile-Plot-to-Row-Color-Set-in-Row/mp/124080
- https://community.jmp.com/t5/Discussions/Change-color-theme-in-plot-legend-of-FIt-Curve/td-p/368792
- https://community.jmp.com/t5/Discussions/assign-marker-style-line-style-by-quot-string-quot-or-special/td-p/48860
Code GB complet :
dt = Data Table( "DT" );
//this short section makes a list of all runs/tests in the data table
//then all the runs are counted in a later section for a "for loop"
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
//below is the graph builder code
gb = Graph Builder(
Size( 850, 600 ),
Show Legend( 1 ),
Show Title( 0 ),
Show Footer( 0 ),
Fit to Window( "Off" ),
Variables(
X( :TEMP ),
Y( :CONVERSION ),
Overlay( :RUN_NUM ),
Color( :RUN_NUM )
),
Elements(
Points( X, Y, Legend( 1 ) ),
Line Of Fit(
X,
Y,
Legend( 2 ),
Degree( "Quadratic" ),
Confidence of Fit( 0 )
)
),
SendToReport(
Dispatch( {"Line Of Fit"}, "", OutlineBox, {Close( 0 )} ),
Dispatch(
{},
"TEMP",
ScaleBox,
{Min( 50 ), Max( 100 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Show Major Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )
}
)}
),
Dispatch(
{},
"CONVERSION",
ScaleBox,
{Min( 40 ), Max( 60 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Automatic Font Size( 0 ), Show Major Grid( 1 ),
Show Minor Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )}
)}
),
Dispatch(
{},
"X title",
TextEditBox,
{Set Text( "Temperature" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
Dispatch(
{},
"Y title",
TextEditBox,
{Set Text( "Conversion" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
)
);
//this loop goes through all runs and changes lines to dashed and changes their width
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
}
)
)
);
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
}
)
)
);
Merci pour votre réponse ! Compte tenu de ma compréhension limitée des états de ligne, je ne pense pas vouloir les utiliser. Les états de ligne fonctionnent bien pour ce très petit ensemble de données, mais mes ensembles de données réels impliquent plus d'une centaine de tests. Si j'utilise les états de ligne pour attribuer des couleurs, les couleurs finiront par se répéter avec une nuance légèrement différente. J'aurai donc des tests de teinte rouge n° 1, n° 2, n° 3, etc. Ensuite, si j'ai besoin d'un graphique de ces tests spécifiques, ils seront tous de rouges légèrement différents et il sera très difficile de les distinguer par la couleur. Je préférerais que le schéma de couleurs soit lié au graphique, de sorte que, quel que soit le sous-ensemble de tests que je trace, le schéma de couleurs soit toujours le même. Autrement dit, les mêmes tests de teinte rouge n° 1, n° 2, n° 3, etc. avec les états de ligne seraient bleu, rouge, vert, etc., le schéma de couleurs étant lié au graphique. J'ai seulement mentionné la couleur ci-dessus, mais je pense que ce serait le même scénario pour les formes de marqueurs également, c'est-à-dire que les formes de marqueurs d'état de ligne peuvent éventuellement se répéter dans de grands ensembles de données, il y aurait donc un sous-ensemble de tests qui auraient tous les mêmes formes de marqueurs.
Pour les couleurs, vous disposez de plus d'options et leur gestion est plus simple que celle des marqueurs. Actuellement, vous ne pouvez définir qu'une seule colonne pour la superposition ; vous devrez donc probablement utiliser le gestionnaire de changement de filtre pour que tous les styles fonctionnent correctement. Par défaut, vous obtiendrez un tracé comme celui-ci.

Vous pouvez ensuite utiliser le gestionnaire de changement de filtre pour conserver des marqueurs de taille supérieure et un style de ligne. Avec ce type de traitement, JMP peut parfois se tromper et oublier qu'il doit ajouter de la couleur.
</CODE></PRE>
<P>Je pense que tu pourrais aussi essayer de gérer le cauchemar appelé Légende, mais… je l'éviterais si possible. C'est l'un des pires (ou peut-être le pire) éléments de Graph Builder que tu puisses essayer de manipuler.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-849266" slang="en-US" mode="CREATE">Re : Forcer JMP à faire correspondre la couleur de la ligne d'ajustement à la couleur du marqueur avec un style de ligne forcé</LINGO-SUB><LINGO-BODY id="lingo-body-849266" slang="en-US" mode="CREATE"><P>La taille du marqueur peut être contrôlée à partir du menu contextuel et il s'agit d'un contrôle pour la zone de cadre.</P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/74118i18BC8FCF0D2275C2/jthi_0-1742669047885.png" role="button" title="jthi_0-1742669047885.png" alt="jthi_0-1742669047885.png" /></span></SPAN></SPAN></SPAN></SPAN></P>
<P>Je n'ai rien trouvé de similaire pour les lignes cependant... donc peut-être que quelque chose comme ça pourrait fonctionner</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(Points(X, Y, Legend(5)), Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))),
Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7)))),
SendToReport(Dispatch({}, "Graph Builder", FrameBox, {Marker Size(6), Marker Drawing Mode("Normal")}))
);
l_expr = Expr(Legend Model(7));
Summarize(dt, c = By(:RUN_NUM));
For Each({item}, c,
cur_expr = EvalExpr(Properties(0, {Line Style("Dashed")}, Item ID(Expr(item), 1)));
Insert Into(l_expr, Name Expr(cur_expr));
);
d_expr = EvalExpr(
Dispatch({}, "400", ScaleBox,
{Expr(Name Expr(l_expr))}
)
);
Eval(EvalExpr(Send(gb, Expr(Name Expr(d_expr)))));Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(
Points(X, Y, Legend(5)),
Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))
)
);
ldf = gb << Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7))));
Eval(EvalExpr(
f = Function({a},
gb_rep = Expr(Report(gb));
gb << inval;
fb = gb_rep[FrameBox(1)];
segs = fb << Find Segs;
For Each({seg}, segs,
Match(seg << class name,
"MarkerSeg", seg << Set Marker Size(10),
"LineSeg", seg << Set Line Style("Dashed")
);
);
);
));
rs = ldf << Make Filter Change Handler(f);
f(1); // to initialize at least once