Scripting Graph Builder – Boxplot in Punkte umwandeln?Hallo,
Ich empfinde die Skripterstellung für den Graph Builder als brutale Erfahrung (ich erstelle schon seit einiger Zeit Skripts für JMP). Es scheint weder intuitiv zu sein, noch kann ich die spezifische Hilfe finden, die ich brauche. Also schwenke ich meine weiße Flagge und frage die Gruppe.
Mein Skript erfasst die richtigen Spalten (deren Anzahl variiert) und erstellt ordnungsgemäß einen Graph Builder mit zwei verschachtelten X-Ebenen. Das Problem besteht darin, dass die erste Variable, die ich gebe, zwar ordnungsgemäß Punkte hat, der Graph Builder jedoch aus irgendeinem Grund jeder anderen Variablen Boxplots zuweist (was in meinem Skript nirgends zu sehen ist). Daher suche ich nach einer einfachen Möglichkeit, alle meine y-Variablen in Punkte umzuwandeln. Ich vermute, dass es sich dabei um eine Schleife durch Elements handelt, aber ich werde verdammt sein, wenn ich herausfinden kann, wie man das richtig macht.
Gedanken? Hat jemand auch eine gute Referenz für detaillierte Skripterstellung für Graph Builder?
TIA! Fred
Betreff: Scripting Graph Builder – Boxplot in Punkte umwandeln?Ja. Ich stimme zu. Das war auch mein Ansatz, es zu lernen, aber im Vergleich zu den anderen Skripten ist es erstaunlich frustrierend. Ein reifer Bereich für weitere Diskussionen!
Betreff: Scripting Graph Builder – Boxplot in Punkte umwandeln?Danke für die Hilfe. Ich habe den folgenden Ansatz gewählt (durch Iteration ... viele Fehler!):
1. Ich habe eine Liste mit Spaltennamen, die ich in das Diagramm einfügen möchte. Es befindet sich in der Liste „a“ (nicht angezeigt). Das ist es, was ich planen möchte.
2. Ich erstelle eine Liste aus den Datentabellenspalten, die meiner Suchliste entsprechen. Dies sind die vorhandenen Y-Achsenvariablen, die ich darstellen kann.
3. Ich baue einen Graph Builder und stelle meine X-Achse mit verschachtelten Variablen ein. Dies gilt für alle meine Daten.
4. Dann durchlaufe ich die Variablen und füge sie hinzu.
5. Dann durchlaufe ich die Elemente und füge sie hinzu.
6. Dann durchlaufe ich die Gitternetzlinien und füge sie hinzu. Und dann endlich Titel.
Bei den Schritten 4 bis 6 stürzte JMP immer wieder ab, wenn ich versuchte, diese Dinge in einer einzigen Schleife zu erledigen. So bin ich an diesen Punkt gekommen. Das Skript funktioniert (es mussten einige kleinere vertrauliche Dinge entfernt werden), ist aber nicht schnell.
Im Vergleich zu anderen JSL, die ich programmiert habe, ist dies ziemlich umständlich. Ich hatte noch nie so viele JMP-Abstürze. Aber es funktioniert.
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Betreff: Scripting Graph Builder – Boxplot in Punkte umwandeln?Die JSL-Skripte von Graph Builder sind nicht leicht zu verstehen.Mein Ansatz besteht darin, das Diagramm nach meinen Wünschen anzupassen, dann auf das rote Dreieck zu klicken und das resultierende Skript zu erhalten.
Wenn Sie jedoch über eine dynamische Anzahl von Y-Variablen verfügen, können Sie das Skript für 2 oder 3 Y-Variablen abrufen und das GB-Skript auf Muster untersuchen.Dann, um es zu erweitern N Y-Variablen würden Sie dynamisch eine Zeichenfolge erstellen, die das auszuführende GB-Skript enthält, und es dann mit eval(parse(gb_string)) ausführen.
Betreff: Scripting Graph Builder – Boxplot in Punkte umwandeln?Hier ist eine Möglichkeit, Ausdrücke zu verwenden. In diesem Fall gefällt mir dieser Ansatz, weil ich die vollständige Kontrolle habe und den gesamten Startausdruck auf einmal erstellen kann.
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
Mir ist klar, dass diese Antwort keine vollständige Lösung ist. Sie haben nicht genügend Informationen angegeben, um eine Lösung zu versuchen. Außerdem ist es für Sie besser, zu lernen, wie Sie das Problem selbst lösen können. Es soll einen Ansatz veranschaulichen, der für Sie funktionieren könnte.
Betreff: Scripting Graph Builder – Boxplot in Punkte umwandeln?Zeichnen Sie mehrere Spalten in der Y-Rolle oder verwenden Sie mehrere Graph Builder-Objekte, eines für jede Spalte?
Betreff: Scripting Graph Builder – Boxplot in Punkte umwandeln?Nun, ich habe eine kleine Lösung gefunden, aber es ist definitiv instabil.
Ich landete:
- Erstellen des ersten Diagramms mit meinen gewünschten verschachtelten x-Variablen, aber ohne Y-Variablen.
- Dann führe ich eine Schleife aus, um die Y-Variablen hinzuzufügen.
- Dann füge ich eine weitere Schleife hinzu, um das Element für jedes Y zu entfernen und ein neues Element für jedes Y hinzuzufügen, das Punkte hat.
- Dann füge ich eine weitere Schleife hinzu, um für jedes Y Gitterlinien hinzuzufügen.
Fast jeder Schritt hat einen Wait(1) dazwischen. Ich habe zunächst eine einzelne Schleife für jede Variable ausprobiert, die alles erledigt hat, und habe JMP bisher etwa zehn Mal komplett zum Absturz gebracht. Es war meine Fehlerbehebung, die mich zum obigen Formular geführt hat.
Es funktioniert also, aber mir gefällt es auf keinen Fall, dass JMP abstürzt, wenn es nicht richtig codiert ist. Und ich würde mich trotzdem über jemanden freuen, der mich auf eine solide Referenz für die Graph Builder-Skripterstellung hinweist. Dank im Voraus!Fred