こんにちは、みんな、
データ ポイントのラベルの位置を変更する必要があります。問題は、式ステートメント内で新しいラベルの位置 (変数LabelPosText を参照) を定義する必要があることです。以下の例ではこれは必要ないと思いますが、長いコードを実行する手間を省きたいので、簡略化した例を示します。
変数LabelPosTextの内容をグラフビルダーの式部分に取り込むことができなくなりました(対応する行には//here I need helpというラベルが付いています);) )。Eval()、Eval Expr() などの組み合わせをいくつか試しましたが、何も機能しませんでした。
ご協力ありがとうございました!
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\!" )}
)}
)
)
)
)"
)
内部で計算することも可能です。異なるテーブル スクリプトの実行間で値が変わる可能性がある場合は、スクリプトの内部に配置する必要があります。そうでない場合は、スクリプトの外部に移動して、スクリプト内で値を評価します。
一般的に、私はEvilParse (Eval(Parse())の使用を避けます。これはデバッグするのが大変で、私の意見では、それを使用する理由はほとんどないからです。これは複雑に見えますが、私は次のようにアプローチします。
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));
);
));
ラベル オフセットをグラフ ビルダーの外部に移動し、グラフ ビルダーが構築された後にメッセージをグラフ ビルダーに送信することもできます (これにより Set Force Labels が正しく設定されるかどうかはわかりません)
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));
);
));
最終的なテーブルスクリプトは次のようになります
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);
グラフビルダーから取得したスクリプト
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")}
)}
)
)
);
とても新しいです。この情報に感謝します。特にラベルなしでは非常に役立ちます。
Label Offsetについては、多くのドキュメントを見つけることができませんでした。ユーザーが使用することを意図した機能はないようですね。
面白い:
- x /y 座標は二重チェックにのみ使用されるようです。これを使用してコマンドを簡素化できます。
これらを削除するには、MALE に間違った値を入力するだけです。
- オフセットにはどのような座標系が使用されていますか? 一定のオフセットでは、各ラベルのシフトは一定にはなりません。

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" )}
)}
)
)
)));