So durchlaufen Sie programmgesteuert eine Graph Builder-Baumstruktur und verknüpfen Frameboxen mit ihren Titeln.Ich habe eine Analyse (siehe unten), in der ich bestimmte Diagramme mithilfe eines von mir geschriebenen Skripts mit Anmerkungen versehen möchte. Ich möchte beispielsweise Anmerkungen zu XXX104 und XXX107 hinzufügen. In beiden Diagrammen füge ich eine benutzerdefinierte Grafik und einen Text hinzu, um eine Gruppe von Punkten zu identifizieren, auf die ich aufmerksam machen möchte.

Mit dem Befehl „<< Baumstruktur anzeigen“ kann ich die Frameboxen identifizieren, in denen sich die einzelnen Diagramme befinden. Allerdings wird mir der damit verbundene Diagrammname nicht angezeigt. Beispielsweise möchte ich in der Lage sein, diesen Baum mithilfe der Diagrammnamen (z. B.

Tatsächlich sehe ich im gesamten Baum keine „Baumknoten“, die den „Diagrammnamen“ wie XXX107 haben
Letztendlich ist die folgende Tabelle das, was ich erreichen möchte

Hier ist der Code, mit dem ich das manuell gemacht habe. Die Datei wird ebenfalls hochgeladen.
Mein Problem ist, dass ich nicht herausfinden kann, wie ich auf eine Framebox verweisen kann, indem ich den entsprechenden „Titel“ im Anzeigebaum identifiziere.
Prost, Troy
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");
);
);
Automatisierung und SkripterstellungBetreff: So durchlaufen Sie programmgesteuert eine Graph Builder-Baumstruktur und verknüpfen Frameboxen mit ihren Titeln.GFrameBoxes werden in einer bestimmten Reihenfolge sortiert (es könnte eine gute Idee sein, dies mithilfe der Spalteneigenschaft „Wertreihenfolge“ zu erzwingen). Sie können den Framebox-Index basierend auf dieser Reihenfolge erhalten
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);
);
));
Denken Sie auch daran, die Werte in einem grafischen Skript auszuwerten, damit Sie nicht mit diesem Problem enden.

Im Allgemeinen ist es sehr schwierig, auf GraphBuilderGroupBox zuzugreifen bzw. diese zu manipulieren, und ich würde versuchen, dies so weit wie möglich zu vermeiden. Sie können die Titel mit XPath abrufen, es können jedoch zusätzliche Titel vorhanden sein
(Report(myGraphBox) << XPath("//GraphBuilderGroupBox/text()"))
{"ENTITY", "XXX101", "XXX102", "XXX103", "XXX104", "XXX105", "XXX106", "XXX107","XXX112", "XXX118", "XXX119"}Betreff: So durchlaufen Sie programmgesteuert eine Graph Builder-Baumstruktur und verknüpfen Frameboxen mit ihren Titeln.Schnelles und schmutziges vollständiges Beispiel:
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");
);

(Ich habe so etwas schon früher für Wafermaps gemacht)
Betreff: So durchlaufen Sie programmgesteuert eine Graph Builder-Baumstruktur und verknüpfen Frameboxen mit ihren Titeln.Danke für die Hilfe, Jarmo.
Ich habe nicht einen ganzen Haufen Arbeit damit verbracht, diese Bäume zu durchqueren, aber die Art und Weise, wie Sie es erklären, ist großartig ..... vielleicht könnte dies ein Thema für den Scripters Club im nächsten Jahr sein 
Prost, Troy
Betreff: So durchlaufen Sie programmgesteuert eine Graph Builder-Baumstruktur und verknüpfen Frameboxen mit ihren Titeln.Ein tieferer Einblick in die Berichtsebene könnte definitiv ein gutes Thema sein.