プログラムでグラフ ビルダーのツリー構造をたどって、フレームボックスをタイトルに関連付ける方法。作成したスクリプトを使用して特定のチャートに注釈を付けたい分析の一部があります (下記を参照)。 たとえば、XXX104とXXX107にアノテーションを追加したいとします。 これらのグラフの両方に、注意を引きたいポイントの集合を特定するためにカスタムのグラフィックとテキストを追加します。

コマンド「<< show Tree Structure」を使用すると、各チャートが含まれるフレームボックスを識別できます。 ただし、それらに関連付けられたチャートの「名前」が表示されません。 たとえば、チャート名 (XXX107 など) をルックアップとして使用してこのツリーをトラバースし、関連するフレームボックス (FrameBox(7) など) を識別して、それを参照して注釈を自動で追加できるようにしたいと考えています。

実際、ツリー全体で、XXX107 などの「チャート名」を持つ「ツリー ノード」は見当たりません。
最終的には以下のグラフが私が達成したいことです

これを手動で行うために使用したコードは次のとおりです。 ファイルもアップロードされます。
私の問題は、表示ツリー内の対応する「タイトル」を識別してフレームボックスを参照する方法を理解できないことです。
乾杯、トロイ
clearLog();
try(close(DT, noSave));
DT = open("PRE_CLEAN_DATA.jmp", invisible);
DT << newColumn("ENT_CLUSTER", character, nominal, formula(:ENTITY || "_" || :CLUSTER));
Plat = newWindow("CHART",
myGraphBox = DT << Graph Builder(
Size( 1446, 747 ),
Show Control Panel( 0 ),
Variables(
X( :WW ),
Y( :ENTITY_MEAN ),
Y( :GRAND_MEAN, Position( 1 ) ),
Wrap( :ENTITY ),
Color( :CLUSTER )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 23 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Legend( 24 ) )
),
SendToReport(
Dispatch(
{},
"WW",
ScaleBox,
{Min( 202301.28 ), Max( 202320.72 ), Inc( 1 ), Minor Ticks( 1 ),
Label Row(
{Automatic Tick Marks( 0 ), Label Orientation( "Vertical" ),
Show Minor Ticks( 0 )}
)}
)
)
);
summarize(DT, clusters = by(:ENT_CLUSTER));
foreach({item}, clusters,
if(contains(item, "NON_CLUSTER"), continue());
ent = word(1, item, "_");
clust = word(2, item, "_");
write("Entity = " || ent || "\!n");
write("Cluster = " || clust || "\!n");
left = min(DT:WW[DT << getRowsWhere(:ENT_CLUSTER == item)]);
right = max(DT:WW[DT << getRowsWhere(:ENT_CLUSTER == item)]);
group_mean_min = min(DT:ENTITY_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
group_mean_max = max(DT:ENTITY_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
grand_mean_min = min(DT:GRAND_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
grand_mean_max = max(DT:GRAND_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
if(group_mean_min < grand_mean_min, bot = group_mean_min, bot = grand_mean_min);
if(group_mean_max > grand_mean_max, top = group_mean_max, top = grand_mean_max);
write("Left, Right, Top, Bot = " || char(left) || ", " || char(right) || ", " || char(top) || ", " || char(bot) || "\!n");
// ##########################################################
// ## This is what I want to do:
// ##########################################################
// 1. Traverse the graphbox tree
// 2. Identify Frame Box for each of the entities found
// 3. Get the Framebox Reference
// 4. Add my annotation.
// This is a manual Example I made using the show properties and tree structure commands
//myGraphBox << Show Properties();
//myGraphBox << Show tree structure();
rep = myGraphBox << report;
framebox = rep[frame box( 7 )];
framebox << Add Graphics Script(
penColor( "Black" );
fillcolor("Blue");
Transparency(0.1);
rect( left, top, right, bot, 0 );
rect( left, top, right, bot, 1 );
);
framebox << Add Graphics Script(
textSize(9);
textColor("Blue");
text( {left, top}, "Cluster 1" );
);
write("\!n");
);
);
自動化とスクリプト作成Re: プログラムでグラフ ビルダーのツリー構造をトラバースし、フレームボックスをタイトルに関連付ける方法。GFrameBox は特定の順序でソートされます (Value Order 列プロパティを使用して強制的にソートすることをお勧めします)。 その順序に基づいてフレームボックスインデックスを取得できます
cluster_rows = Loc(dt[0, "ENT_CLUSTER"], "XXX104_CLUSTER1");
fb_idx = Contains(clusters, "XXX104_CLUSTER1"); // framebox idx // might not work in all cases!
fbs = Report(myGraphBox) << XPath("//FrameBox");
Eval(EvalExpr(
fbs[fb_idx] << Add Graphics Script(
Pen Color("Black");
Fill Color("Red");
Transparency(0.1);
Rect(Expr(left), Expr(top), Expr(right), Expr(bot), 0);
Rect(Expr(left), Expr(top), Expr(right), Expr(bot), 1);
);
));
また、このような事態に陥らないように、値をグラフィック スクリプトで評価することも忘れないでください。

一般に、GraphBuilderGroupBox へのアクセスや操作は非常に難しいため、できる限り回避するように努めます。 XPath を使用してタイトルを取得できますが、追加のタイトルが存在する可能性があります
(Report(myGraphBox) << XPath("//GraphBuilderGroupBox/text()"))
{"ENTITY", "XXX101", "XXX102", "XXX103", "XXX104", "XXX105", "XXX106", "XXX107","XXX112", "XXX118", "XXX119"}Re: プログラムでグラフ ビルダーのツリー構造をトラバースし、フレームボックスをタイトルに関連付ける方法。簡単で汚い完全な例:
Names Default To Here(1);
dt = Open("$DOWNLOADS/PRE_CLEAN_DATA.jmp", invisible);
dt << New Column("ENT_CLUSTER", character, nominal, formula(:ENTITY || "_" || :CLUSTER));
gb = dt << Graph Builder(
Size(1446, 747),
Show Control Panel(0),
Variables(X(:WW), Y(:ENTITY_MEAN), Y(:GRAND_MEAN, Position(1)), Wrap(:ENTITY), Color(:CLUSTER)),
Elements(Points(X, Y(1), Y(2), Legend(23)), Smoother(X, Y(1), Y(2), Legend(24))),
SendToReport(
Dispatch(
{},
"WW",
ScaleBox,
{Min(202301.28), Max(202320.72), Inc(1), Minor Ticks(1), Label Row(
{Automatic Tick Marks(0), Label Orientation("Vertical"), Show Minor Ticks(0)}
)}
)
)
);
rep = Report(gb);
fbtitles = (rep << XPath("//GraphBuilderGroupBox/text()"));
Remove From(fbtitles, Contains(fbtitles, "ENTITY")); // we "know" we have wrap variable
// or we could perform filtering using Filter Each
Summarize(dt, clusters = by(:ENT_CLUSTER));
For Each({item}, clusters,
If(Contains(item, "NON_CLUSTER"),
Continue()
);
ent = Word(1, item, "_");
clust = Word(2, item, "_");
Write("Entity = " || ent || "\!n");
Write("Cluster = " || clust || "\!n");
left = Min(DT:WW[DT << getRowsWhere(:ENT_CLUSTER == item)]);
right = Max(DT:WW[DT << getRowsWhere(:ENT_CLUSTER == item)]);
group_mean_min = Min(DT:ENTITY_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
group_mean_max = Max(DT:ENTITY_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
grand_mean_min = Min(DT:GRAND_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
grand_mean_max = Max(DT:GRAND_MEAN[DT << getRowsWhere(:ENT_CLUSTER == item)]);
If(group_mean_min < grand_mean_min,
bot = group_mean_min,
bot = grand_mean_min
);
If(group_mean_max > grand_mean_max,
top = group_mean_max,
top = grand_mean_max
);
Write("Left, Right, Top, Bot = " || Char(left) || ", " || Char(right) || ", " || Char(top) || ", " || Char(bot) || "\!n");
framebox = rep[frame box(Contains(fbtitles, ent);)];
Eval(EvalExpr(
framebox << Add Graphics Script(
Pen Color("Black");
Fill Color("Blue");
Transparency(0.1);
Rect(Expr(left), Expr(top), Expr(right), Expr(bot), 0);
Rect(Expr(left), Expr(top), Expr(right), Expr(bot), 1);
);
));
Eval(EvalExpr(
framebox << Add Graphics Script(
Text Size(9);
Text Color("Blue");
Text({Expr(left), Expr(top)}, Expr(clust));
);
));
Write("\!n");
);

(以前にウエハーマップに関してこれと似たようなことをしました)
Re: プログラムでグラフ ビルダーのツリー構造をトラバースし、フレームボックスをタイトルに関連付ける方法。ジャーモさん、助けてくれてありがとう。
これらの木々を横断するための作業はまだ山積みではありませんが、あなたの説明の仕方は素晴らしいです。おそらく、これは来年のスクリプター クラブのトピックになるかもしれません 
乾杯、トロイ
Re: プログラムでグラフ ビルダーのツリー構造をトラバースし、フレームボックスをタイトルに関連付ける方法。レポート層をさらに深く掘り下げることは、間違いなく良いトピックの 1 つになる可能性があります。