Salut tout le monde,
Je dois modifier les positions des étiquettes des points de données. Mon problème est que je dois définir les nouvelles positions des étiquettes (voir la variable LabelPosText ) à l'intérieur de l'instruction d'expression. Je sais que cela ne serait pas nécessaire dans l'exemple ci-dessous, mais je veux vous épargner l'effort de travailler sur mon long code, donc je vous montre un exemple simplifié.
Je ne parviens pas à insérer le contenu de la variable LabelPosText dans la partie expression du Graph Builder (la ligne correspondante est étiquetée avec //ici j'ai besoin d'aide
). J'ai essayé plusieurs combinaisons de Eval(), Eval Expr(), etc., mais rien n'a fonctionné pour moi.
Merci beaucoup pour votre aide !
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Eval(
Parse(
"dt << New Script(\!"test script\!",
<BR /> //defining new label positions for some data points
Rows = dt << get rows where( :Sex == \!"F\!" );
LabelPosText = \!"\!";
For Each({row, idx}, Rows,
WeightValue = Column( dt, \!"weight\!")[row];
HeightValue = Column( dt, \!"height\!")[row];
LabelPosText = LabelPosText || \!"{\!"|| char(row-1) ||\!", -5, 12, \!"|| char(WeightValue) ||\!", \!"|| char(HeightValue) ||\!"}\!";
if(idx < N Items(Rows),
LabelPosText = LabelPosText || \!", \!"
)
);
Graph Builder(
Size( 528, 456 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, \!"Graph Builder\!", FrameBox,
{DispatchSeg(
Marker Seg( 1 ),
{Label Offset( LabelPosText ), //here I need help ;)
Set Force Labels( \!"Label by Row\!" )}
)}
)
)
)
)"
)
Il est possible de les calculer à l'intérieur. S'il existe une possibilité qu'ils changent entre les différentes exécutions de script de table, ils doivent être à l'intérieur, sinon je les déplacerais à l'extérieur et évaluerais la valeur à l'intérieur du script.
En général, j'éviterais toujours d'utiliser EvilParse (Eval(Parse()) car c'est un cauchemar à déboguer et, à mon avis, il n'y a presque jamais de raison de l'utiliser. Cela semble compliqué, mais j'aborderais cela avec quelque chose comme ça
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Label Offset has very annoying format to build as it isn't list with lists
// but just something with lists
table_script = Expr(
Names Default To Here(1);
Rows = Current Data Table() << get rows where(:Sex == "F");
offsets = Expr(Label Offset());
For Each({row, idx}, Rows,
WeightValue = :weight[row];
HeightValue = :height[row];
l = Eval List({row - 1, -5, 12, WeightValue, HeightValue});
Insert Into(offsets, l);
);
Eval(Substitute(
Expr(Graph Builder(
Size(528, 456),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(5))),
SendToReport(
Dispatch({}, "Graph Builder", FrameBox,
{DispatchSeg(
Marker Seg(1),
{_labeloffset_,
Set Force Labels("Label by Row")}
)}
)
)
)),
Expr(_labeloffset_), Name Expr(offsets)
));
);
Eval(EvalExpr(
dt << New Script("test script",
Expr(Name Expr(table_script));
);
));
Vous pouvez également déplacer le décalage de l'étiquette en dehors du générateur de graphiques et envoyer le message au générateur de graphiques une fois celui-ci créé (je ne suis pas sûr que cela définisse correctement les étiquettes de force).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Label Offset has very annoying format to build as it isn't list with lists
// but just something with lists
table_script = Expr(
Names Default To Here(1);
Rows = Current Data Table() << get rows where(:Sex == "F");
offsets = Expr(Label Offset());
For Each({row, idx}, Rows,
WeightValue = :weight[row];
HeightValue = :height[row];
l = Eval List({row - 1, -5, 12, WeightValue, HeightValue});
Insert Into(offsets, l);
);
gb = Graph Builder(
Size(528, 456),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(5))),
SendToReport(
Dispatch({}, "Graph Builder", FrameBox,
{DispatchSeg(
Marker Seg(1),
{Set Force Labels("Label by Row")}
)}
)
)
);
ms = Report(gb)[FrameBox(1)] << Find Seg(MarkerSeg(1));
Eval(EvalExpr(Send(ms, Expr(Name Expr(offsets)))));
wait(0);
);
Eval(EvalExpr(
dt << New Script("test script",
Expr(Name Expr(table_script));
);
));
Le script de la table finale devrait ressembler à ceci
Names Default To Here(1);
Rows = Current Data Table() << get rows where(:Sex == "F");
offsets = Expr(Label Offset());
For Each({row, idx}, Rows,
WeightValue = :weight[row];
HeightValue = :height[row];
l = Eval List({row - 1, -5, 12, WeightValue, HeightValue});
Insert Into(offsets, l);
);
gb = Graph Builder(
Size(528, 456),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(5))),
SendToReport(
Dispatch({}, "Graph Builder", FrameBox,
{DispatchSeg(Marker Seg(1), {Set Force Labels("Label by Row")})}
)
)
);
ms = Report(gb)[FrameBox(1)] << Find Seg(Marker Seg(1));
Eval(Eval Expr(ms << Expr(Name Expr(offsets))));
Wait(0);
et le script que vous obtenez du générateur de graphiques
Graph Builder(
Size(528, 456),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(5))),
SendToReport(
Dispatch({}, "Graph Builder", FrameBox,
{DispatchSeg(
Marker Seg(1),
{Label Offset(
{8, -5, 12, 112, 60},
{0, -5, 12, 95, 59},
{9, -5, 12, 107, 61},
{1, -5, 12, 123, 61},
{10, -5, 12, 67, 56},
{2, -5, 12, 74, 55},
{3, -5, 12, 145, 66},
{4, -5, 12, 64, 52},
{15, -5, 12, 81, 61},
{16, -5, 12, 91, 62},
{17, -5, 12, 142, 65},
{18, -5, 12, 84, 63},
{19, -5, 12, 85, 62},
{27, -5, 12, 92, 62},
{28, -5, 12, 112, 64},
{34, -5, 12, 112, 65},
{35, -5, 12, 115, 60},
{37, -5, 12, 116, 62}
), Set Force Labels("Label by Row")}
)}
)
)
);
très nouveau, merci pour cette info - surtout avec No Labels, cela peut être vraiment utile !!
Pour Label Offset , je n'ai pas pu trouver beaucoup de documentation - il semble qu'il n'y ait aucune fonctionnalité destinée à être utilisée par les utilisateurs ?
Intéressant:
- les coordonnées x/y semblent simplement être utilisées pour une double vérification. Cela peut être utilisé pour simplifier la commande :
il suffit de fournir des valeurs erronées pour MALE pour s'en débarrasser.
- Quel système de coordonnées est utilisé pour les décalages ? Un décalage constant n'entraîne pas un décalage constant pour chaque étiquette.

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
LabelPosOffsets = Expr(Label Offset());
For Each row(
Insert Into(LabelPosOffsets,Eval List({row() - 1, -100,100,:weight+if( sex=="F", 0,1),:height}))
);
Eval (Eval Expr(Graph Builder(
Size( 528, 456 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ), Color( :sex ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "Graph Builder", FrameBox,
{DispatchSeg(
Marker Seg( 1 ),
{ Expr(Name Expr(LabelPosOffsets) ), Set Force Labels( "Label by Row" )}
)}
)
)
)));