Hi. Ich bin daran interessiert zu wissen, dass es eine Skriptmethode gibt, um die angezeigten Werte für eine Achse in Graphbuilder zu lesen und sie als Liste zurückzugeben. IOW, gibt es eine Funktion oder eine Nachricht, die die Achsenwerte aus einer Graphbuilder-Referenz oder einem Achsenfeld "holen" kann? So etwas wie: xval_lis = gb << Werte der X-Achse abrufen.
Angenommen, ich habe den folgenden Graphen:

dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size(513, 406),
Show Control Panel(0),
Back Color("White"),
Variables(X(:age), X(:sex, Position(1)), Y(:weight)),
Elements(Points(X(1), Y, Legend(1)), Smoother(X(1), Y, Legend(2))),
Local Data Filter(
Add Filter(
columns(:age),
Where(:age == {12, 13, 14}),
Display(:age, Size(170, 96), List Display)
)
),
SendToReport(Dispatch({}, "", AxisBox, {Select}))
)Da der Benutzer bestimmte Altersgruppen mit dem lokalen Datenfilter ausgeschlossen hat, werden hier nicht alle Altersgruppen in der Tabelle auf der x-Achse angezeigt. In diesem Fall hätte ich gerne eine Möglichkeit abzulesen, welche Altersgruppen tatsächlich in der Grafik angezeigt werden. Diese Frage gilt nur, wenn für die Achse eine nominale oder ordinale Variable verwendet wird (keine kontinuierlichen Variablen).
Ich habe die folgende Skriptmethode in Betracht gezogen:
1. Lesen Sie den lokalen Datenfilter aus
2. Erstellen Sie eine Teilmengentabelle nur aus den ungefilterten Zeilen
3. Verwenden Sie die Summarize-Funktion für diese Tabelle, um meine Liste der angezeigten Achsenwerte zu erhalten
ldf_str = ldf << Get Where Clause; //ldf = reference to local data filter in gb window
clause = Parse(Regex(ldf_str, "Select Where\((.+)\)$", "\1"));
r = dt << Get Rows Where(Eval(clause)); //dt = ref to main datable
dtsub = dt << Subset(//Invisible,
Selected Rows(0),
Rows(r),
Selected columns only(0)
);
Summarize(dtsub, xlev_lis = By(:age, :sex));
Diese Methode erscheint jedoch unhandlich. Gibt es einen Befehl, der die Achsenwerte aus einer Graphbuilder-Referenz oder einem Achsenfeld "erhalten" kann?
@nikles ,
Sie sind sich Ihres Benutzerszenarios jedoch nicht sicher, wenn der Benutzer aktiv filtert, kann er auch die GraphBuilder-Struktur, verschiedene Rollen usw. ändern. Also a Filteränderungs-Handler wäre robuster. Beachten Sie auch, dass die Where-Klausel () die Umkehrung nicht erfasst. Das Skript und die TextBox des Where erfasst das Inverse als Not (!)

Unten und angehängt ist ein Skript, das die Xticks erhält und sie in das Protokoll druckt, wenn sich der Filter ändert.Hier ist ein Screenshot des eingebetteten Protokolls mit Kommentaren (//) und zusätzlichen Zeilenvorschüben.

Names Default to Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size(513, 406),
Show Control Panel(0),
Back Color("White"),
Variables(X(:age), X(:sex, Position(1)), Y(:weight)),
Elements(Points(X(1), Y, Legend(1)), Smoother(X(1), Y, Legend(2))),
Local Data Filter(
Add Filter(
columns(:age),
Where(:age == {12, 13, 14}),
Display(:age, Size(170, 96), List Display)
)
),
SendToReport(Dispatch({}, "", AxisBox, {Select}))
);
//iftb = (report(gb)[PictureBox(1)]<<SIB></SIB>
Anmerkungen:
- Zeile 20 ist kommentiert; Es zeigt, wie man ein Handle auf die Where TextBox bekommt.
- Schlüsselmerkmale der Funktion f, die für den Filter Change Handler verwendet wird, sind die Fähigkeiten der JMP-Implementierung von Associative Array: mehrere Methoden, um es zu definieren; um eindeutige Werte in einer Liste zu erhalten; fast jedes JMP-Objekt kann als Schlüssel verwendet werden.
- Weitere Schlüsselfunktionen sind: dt[ zz, _xvar_] ist eine Liste von Zeilenwerten und ldf << liefert gefilterte Zeilen.