Bonjour les développeurs JSL,
Je travaille sur un script qui me permet d'ajouter ma propre légende à un graphique. Voir la capture d'écran ci-dessous.

J'ai ajouté les lignes et le texte en cliquant avec le bouton droit sur le graphique, puis en sélectionnant « Personnaliser… » et en ajoutant un script au graphique. Le code JSL suivant génère la légende, comme indiqué ci-dessus.
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( [20, 100], [65, 65] );
Text( {120, 64}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( [20, 100], [60, 60] );
Text( {120, 59}, "Height" );
Ce que je cherche à faire, c'est positionner les lignes et le texte de la légende par rapport à, par exemple, 90 % de la valeur maximale de la colonne « Différence de poids [g] ». Le tableau de données est joint, ainsi que le script (la partie non fonctionnelle est commentée). Je pensais utiliser une fonction JSL de type `Eval(Substitute(Expr(...), Expr(__pos__), pos)`, mais j'obtiens l'erreur « Jeton de matrice invalide ». Voici un exemple :
Names Default To Here( 1 );
pos = Col Max( :"Weight diff[g]"n );
Eval(
Substitute(
Expr(
Graph Builder(
Size( 510, 510 ),
Show Legend( 0 ),
Graph Spacing( 4 ),
Variables(
X( :"MeasTime [s]"n ),
Y( :"Weight diff [g]"n ),
Y( :"Height diff [mm]"n, Position( 1 ), Side( "Right" ) )
),
Elements( Line( X, Y( 1 ), Legend( 5 ) ), Line( X, Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "MeasTime [s]", ScaleBox, {Inc( 100 )} ),
Dispatch( {}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description( "" ),
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( [20, 100], [__pos__, __pos__] );
Text( {120, 64}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( [20, 100], [60, 60] );
Text( {120, 59}, "Height" );
)}
)
)
)
),
Expr( __pos__ ), Eval( Round( 0.9 * pos, 0 ) )
)
);
J'ai même essayé d'encadrer les coordonnées y de la fonction Line() par des accolades (« { } »), comme ceci : Line([20, 100],[{_pos__,__pos__}]), mais j'obtiens toujours la même erreur. Je préférerais utiliser une variable comme « pos », extraite d'une colonne, plutôt qu'une valeur absolue, car les valeurs des colonnes peuvent changer et j'ai besoin que les éléments du graphique, comme la ligne et le texte, puissent se déplacer par rapport à ce qui est représenté.
Auriez-vous des suggestions pour contourner cette erreur et/ou ce qui me manque ? Cette approche devrait fonctionner, mais je ne comprends pas pourquoi.
Merci!,
DS
Salut @jthi ,
Merci pour l'astuce ! Avec une petite modification, ça m'a beaucoup aidé et j'ai obtenu exactement ce dont j'avais besoin, merci !
Merci également pour votre réponse rapide !
DS
Si cela intéresse d'autres lecteurs, j'ai modifié le code JSL (voir ci-dessous) comme suit :
Names Default To Here( 1 );
x1=300;
y2=36.7;
Graph Builder(
Size( 510, 510 ),
Show Legend( 0 ),
Graph Spacing( 4 ),
Variables( X( :"MeasTime [s]"n ), Y( :"Weight diff [g]"n ), Y( :"Height diff [mm]"n, Position( 1 ), Side( "Right" ) ) ),
Elements( Line( X, Y( 1 ), Legend( 5 ) ), Line( X, Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "MeasTime [s]", ScaleBox, {Inc( 100 )} ),
Dispatch( {}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description( "" ),
Pen Color( "Black" );
Line Style( "Dashed" );
Line( {x1,YOrigin()}, {x1,y2}, {XOrigin(),y2}, {x1,y2} );
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( {XOrigin()+30, 0.9*YRange()}, {XOrigin()+130, 0.9*YRange()} );
Text( {XOrigin()+150, 0.9*YRange()-1}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( {XOrigin()+30, 0.85*YRange()}, {XOrigin()+130, 0.85*YRange()} );
Text( {XOrigin()+150, 0.85*YRange()-1}, "Height" );
)}
)
)
);
Ce qui donne le résultat suivant :

Ce sont des exemples de ce que je cherchais à faire exactement : créer des « légendes » relatives et des lignes de référence spécifiques qui ne couvrent pas toute la longueur/hauteur du graphique.
J'espère que cela pourra aider d'autres personnes qui souhaitent faire quelque chose de similaire.
J'espère que cela aidera d'autres personnes !
DS
Il serait judicieux d'évaluer les valeurs x1 et y2 du script graphique afin d'éviter toutes sortes de problèmes potentiellement gênants.
Voir plus...
Names Default To Here(1);
x1 = 300;
y2 = 36.7;
dt = Current Data Table();
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Size(510, 510),
Show Legend(0),
Graph Spacing(4),
Variables(X(:"MeasTime [s]"n), Y(:"Weight diff [g]"n), Y(:"Height diff [mm]"n, Position(1), Side("Right"))),
Elements(Line(X, Y(1), Legend(5)), Line(X, Y(2), Legend(6))),
SendToReport(
Dispatch({}, "MeasTime [s]", ScaleBox, {Inc(100)}),
Dispatch({}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description(""),
Pen Color("Black");
Line Style("Dashed");
Line({_x1_, Y Origin()}, {_x1_, _y2_}, {X Origin(), _y2_}, {_x1_, _y2_});
Pen Color("Red");
Pen Size(2);
Line Style("Solid");
Line({X Origin() + 30, 0.9 * Y Range()}, {X Origin() + 130, 0.9 * Y Range()});
Text({X Origin() + 150, 0.9 * Y Range() - 1}, "Weight");
Pen Color("Blue");
Pen Size(2);
Line({X Origin() + 30, 0.85 * Y Range()}, {X Origin() + 130, 0.85 * Y Range()});
Text({X Origin() + 150, 0.85 * Y Range() - 1}, "Height");
)}
)
)
)),
Expr(_x1_), x1,
Expr(_y2_), y2
)
);