그래프 빌더 트리 구조를 프로그래밍 방식으로 탐색하고 프레임박스를 해당 제목과 연결하는 방법.내가 작성한 스크립트를 사용하여 특정 차트에 주석을 달고 싶은 분석 부분(아래 참조)이 있습니다. 예를 들어 XXX104와 XXX107에 주석을 추가하고 싶습니다. 이 두 차트 모두에 관심을 끌고 싶은 포인트 클러스터를 식별하기 위해 사용자 정의 그래픽과 텍스트를 추가할 것입니다.

'<< 트리 구조 표시' 명령을 사용하면 각 차트가 있는 프레임박스를 식별할 수 있습니다. 그러나 관련 차트 '이름'은 표시되지 않습니다. 예를 들어, 조회로 차트 이름(예: 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는 특정 순서로 정렬됩니다(값 순서 열 속성을 사용하여 강제로 정렬하는 것이 좋습니다). 해당 순서에 따라 프레임박스 인덱스를 얻을 수 있습니다.
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: 프로그래밍 방식으로 그래프 빌더 트리 구조를 탐색하고 프레임박스를 해당 제목과 연결하는 방법입니다.Jarmo에게 도움을 주셔서 감사합니다.
나는 이 나무들을 횡단하는 작업을 많이 해본 적이 없지만 설명하는 방식은 훌륭합니다. 아마도 이것은 내년 스크립터 클럽의 주제가 될 수 있을 것입니다 
건배, 트로이
Re: 그래프 빌더 트리 구조를 프로그래밍 방식으로 탐색하고 프레임박스를 해당 제목과 연결하는 방법입니다.보고서 계층을 더 깊이 파고드는 것은 확실히 좋은 주제가 될 수 있습니다.