Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Hallo Community!
Ich hatte ewig ein Skript, in dem ich bivariate Diagramme in einer Fit-Gruppe zeichnete, etwa so:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
Der entscheidende Punkt hierbei ist: Ich erhalte eine Liste von Parametern in Form einer Zeichenfolgenliste und stelle sie dann einzeln dar.
Jetzt muss ich vom bivariaten Diagramm zum Graph Builder wechseln, da Graph Builder über einige Funktionen verfügt, Bivariate jedoch nicht.
Ich habe herausgefunden, wie ich das Diagramm des Graph Builders genau wie Bivariate aussehen lassen kann, aber ich kann nicht herausfinden, ob es eine einfache Möglichkeit gibt, GBs in einer Fit-Gruppe wie oben zu zeichnen. Es sieht so aus, als ob die Fit-Gruppe GBs wie folgt annehmen kann:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
Aber für eine beliebige Parameterliste muss ich es in einer Schleife skripten. Ich hatte auf etwas Einfacheres gehofft (funktioniert offensichtlich nicht):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
Gibt es eine Möglichkeit für GB, eine Liste von Parametern zu nehmen und eine Liste von DisplayBoxen auszugeben?
Automatisierung und SkriptingBetreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Du warst ziemlich nah dran. Du musst es in einer Schleife skripten. Das Folgende scheint zu funktionieren. Du könntest die Spaltenliste durch eine GUI-Ausgabe ersetzen oder, wenn du mit GUI-Skripting nicht vertraut bist, vielleicht sogar ein Skript zum Abrufen ausgewählter Spalten erstellen, die zu plottenden Spalten auswählen und diese dann programmgesteuert in die Liste konvertieren.
Die Stärke des Graph Builders liegt in der Interaktivität. Dies macht es weniger optimal, mehrere Diagramme in einem Fenster anzuzeigen, da jedes Diagramm geändert werden müsste (vorausgesetzt, dies ist der Fall), aber durch Skripting ist es (ziemlich) einfach.
Eine meiner Methoden besteht darin, ein Skript zu verwenden, das die Ausgabe auf mehreren Plattformen ermöglicht, darunter y x x und GB. Es erzeugt aber auch den Spaltenumschalter. Anschließend gibt es eine Schaltfläche, um jede Ausgabe der Spaltenumschalterliste in ein Journal zu übertragen. Natürlich ohne Interaktivität.
wie auch immer, hier ist das leicht modifizierte Skript
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Für Graph Builder würden Sie tatsächlich Page verwenden, um einen ähnlichen Effekt zu erzielen, aber hierfür müssen Ihre Daten natürlich in einem bestimmten Format vorliegen. Oder Column Switcher.
Wenn Sie Page nicht verwenden können, würde ich in Erwägung ziehen, Fit Group für Graph Builder zu löschen. Sammeln Sie die Diagramme in der Lineup Box, damit sie einfach in Zeilen gruppiert werden können.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
Wenn Sie die Anzahl der Berichte in jeder Zeile ändern möchten, können Sie dies mit der Lineup Box tun.
<< N Col(1);
Sie können bei Bedarf Skripte zum Gliederungsfeld der obersten Ebene hinzufügen.
Und wenn Sie Fit Group verwenden möchten, können Sie dies tun, es erfordert jedoch einige Ausdrucksverarbeitung. Sie können auch eine Funktion erstellen, die dies für Sie erledigt, wenn Sie dies häufig tun müssen
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Die Einschränkungen, die ich habe, sind die folgenden:
Dieses Skript ist Teil eines Add-Ins. Es akzeptiert derzeit Eingaben als Liste von Spalten in einer Textzeichenfolge (generiert über die GUI).
Und ich brauche keine Interaktivität, sondern ein präzises, mit dem Kunden vereinbartes Format der Plots.
Ich wechsle zu GB, da „Fit Y by X“ offenbar keine einfache Möglichkeit bietet, Fehlerbalken anzuzeigen. Der Kunde möchte plötzlich Fehlerbalken im Diagramm.
Die Frage ist, wie man am effizientesten eine Liste von GBs anstelle eines einzelnen GBs erstellen kann. Ich hatte auf eine nicht dokumentierte Funktion gehofft, die es ermöglicht, dies auf die gleiche Weise wie bei „Fit Group“ und „Fit Y by X“ zu tun.
Aber es sieht so aus, als müsste ich Schleifen skripten.
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Ich glaube, ich muss auf Line Up Box umsteigen. Ich wollte es nicht, da es invasivere Codeänderungen erfordern würde, aber ich mag Skriptausdrücke wirklich nicht. Ich hoffe nur, dass:
1. Ich verwende keine spezifische Funktion dieser Fit-Gruppe an anderer Stelle im Code
2. Ich werde es schaffen, dass es in der Ausgabe genau wie „Fit Group“ aussieht.
Ich zeige jedoch einen Beispielcode der endgültigen Ausgabe.
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Eine Frage an Sie.
Ihr Skript funktioniert einwandfrei, nachdem Sie einen offensichtlichen Tippfehler behoben haben:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
das sich dann problemlos an „lub“ anhängen lässt.
Ich habe das erste von Ihnen vorgeschlagene Skript in einer etwas anderen Form neu geschrieben:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
in meinem Fall wird „listOfGBs“ auch wie folgt angezeigt:
{Graph Builder[], Graph Builder[]}
aber dann online:
lub << Append( listOfGBs );
es generiert einen Fehler:
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
Irgendeine Idee, warum?
Ich werde versuchen, damit herumzuspielen, aber ich möchte GB in einer Funktion behalten.
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Ihr Skript funktioniert nicht mehr, sobald ich Folgendes mache:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
Semantisch sollte es keinen Unterschied machen, ob ich den Graph Builder-Ausdruck direkt verwende oder eine Variable zur Darstellung habe – so habe ich es verstanden. Warum wird das Skript dadurch beschädigt?
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Ok, es funktioniert in dieser Form:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
Ich kann sowohl die Funktion (auf meine Art) als auch den Ausdruck (effektiv auf Ihre Art) verwenden.
Ich weiß nicht, was das vorherige Problem war, aber anscheinend muss ich innerhalb der Funktion eine LineUp-Box erstellen und diese anstelle eines GB-Objekts zurückgeben.
Betreff: Ersetzen von „Bivariate“ durch „Graph Builder“ in einer „Fit Group“Sie fügen eine Liste und keine Diagrammersteller an das Aufstellungsfeld an. Ich würde Ihr Skript in etwa so ändern
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
Beim Erstellen der Graphen ist etwas Vorsicht geboten. Dies lässt sich grundsätzlich vermeiden, indem man mit Ausdrücken experimentiert, diese aber erst erstellen muss. Wenn man die Referenzen nicht sammeln muss, ist es zudem etwas einfacher, da man „Einfügen in“ nicht benötigt. Und man kann sie später mit << XPath abrufen.
Mehr anzeigen...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;