Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Das folgende Beispielskript aus einem früherer Thread (gelöst, danke an @jthi ) von mir ermöglichen es mir, Y-Variablen als Punkte aus einer Liste darzustellen.
ich will hinzufügen Boxplots zusätzlich zu Punkte in meinem Diagramm. Wie füge ich Boxplots im folgenden Skript hinzu?
Names Default To Here(1);
dt = Open("$sample_data\Big Class.jmp");
y_values = {"name", "age", "sex", "weight"};
variables_expr = Expr(Variables(X(:height)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Insert Into(gb_expr, Name Expr(variables_expr));
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Show(Name Expr(gb_expr));
Eval(gb_expr);Automatisierung und SkripterstellungWindowsBetreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Erstellen Sie das Diagramm interaktiv in JMP

Übernehmen Sie das Skript in Ihre Zwischenablage/Ihr Skriptfenster
Graph Builder(
Show Control Panel(0),
Variables(X(:height), Y(:name), Y(:age), Y(:sex), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(1)), Box Plot(X, Y, Legend(5))),
Elements(Position(1, 2), Points(X, Y, Legend(2)), Box Plot(X, Y, Legend(6))),
Elements(Position(1, 3), Points(X, Y, Legend(3)), Box Plot(X, Y, Legend(7))),
Elements(Position(1, 4), Points(X, Y, Legend(4)), Box Plot(X, Y, Legend(8))),
SendToReport(
Dispatch(
{},
"400",
LegendBox,
{Legend Position(
{1, [0], 5, [4, -3], 2, [1], 6, [5, -3], 3, [2], 7, [6, -3], 4, [3],
8, [7, -3]}
)}
)
)
)
Sehen Sie, was geändert werden muss, um BoxPlots einzubinden, wenn der ursprüngliche Diagrammersteller so ist
Graph Builder(
Show Control Panel(0),
Variables(X(:height), Y(:name), Y(:age), Y(:sex), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(1))),
Elements(Position(1, 2), Points(X, Y, Legend(2))),
Elements(Position(1, 3), Points(X, Y, Legend(3))),
Elements(Position(1, 4), Points(X, Y, Legend(4)))
)
Gehen Sie zurück zu Ihrem Skript und probieren Sie kleine Änderungen aus. Sie können ziemlich leicht erkennen, dass Ihnen in Elements und anhand Ihres ursprünglichen Skripts etwas fehlt
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
Es scheint, als ob Sie einfach versuchen sollten, den Boxplot dort im richtigen Format hinzuzufügen
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Führen Sie das Diagramm aus.
Öffnen Sie die Systemsteuerung
Fügen Sie die gewünschten Boxplots hinzu.
Schließen Sie die Systemsteuerung
Gehen Sie zum roten Dreieck und wählen Sie aus
Speichern=>Skript in Skriptfenster
Untersuchen Sie den Code und ändern Sie das Skript, um die zusätzlichen Elemente hinzuzufügen, die das neue Skript enthält und die das alte Skript nicht enthält.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?@txnelson Ich habe genau das getan, Boxplots interaktiv hinzugefügt, dann das resultierende Skript überprüft, die Änderungen in meinem Originalskript vorgenommen, konnte Boxplots aber immer noch nicht zum Laufen bringen.Ich schätze, ich bin immer noch nicht gut darin, zu erkennen, was fehlt/brauchen.
Werde versuchen @jthi Vorschlag jetzt.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Führen Sie Ihre JSL aus, ändern Sie dann das Diagramm so, wie es Ihren Wünschen entspricht, und speichern Sie dann das JSL aus dem neuen Diagramm.Fügen Sie die neue JSL zu diesem Diskussionstrack hinzu und ich werde sie mir ansehen.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?@txnelson Das Folgende kommt meinem tatsächlichen Fall nahe.
Names default To Here (1);
Clear Log ();
dt = Open("$sample_data\Semiconductor Capability.jmp");
y_values = {"NPN1", "IVP1", "PNP4", "NPN4"};
variables_expr = Expr(Variables(X(:lot_id)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Insert Into(gb_expr, Name Expr(variables_expr));
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Show(Name Expr(gb_expr));
Eval(gb_expr); was gibt

Allerdings würde ich mir so etwas wünschen

Das von JMP generierte Skript dafür ist
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) ),
Elements(
Position( 1, 1 ),
Points( X, Y, Legend( 1 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 5 ), Jitter( "None" ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y, Legend( 2 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 6 ), Jitter( "None" ) )
),
Elements(
Position( 1, 3 ),
Points( X, Y, Legend( 3 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 7 ), Jitter( "None" ) )
),
Elements(
Position( 1, 4 ),
Points( X, Y, Legend( 4 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 8 ), Jitter( "None" ) )
),
SendToReport(
Dispatch(
{},
"400",
LegendBox,
{Legend Position(
{1, [0], 5, [4, -3], 2, [1], 6, [5, -3], 3, [2], 7, [6, -3], 4, [3],
8, [7, -3]}
)}
)
)
);Die Frage ist, wie man das obere Skript in diesem Beitrag so ändern kann, dass zusätzlich zu den Punkten auch ein Boxplot enthalten ist.
Das Hinzufügen von Box Plots () direkt unter Points () bringt mir nicht beides.
Ich vermute, dass meine Platzierung für Box Plots () falsch ist. Brauche hier Hilfe.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Ich glaube, Sie haben standardmäßige „Boxplot“-Ausreißer verwendet.
Suchen Sie nach einer „Boxplot“-Quantilmethode, die alle Punkte verbindet?

Graph Builder(
Size( 1135, 705 ),
Show Control Panel( 0 ),
Variables(
X( :“S-b"n ),
Y( :C),
Color( :“S-b"n )
),
Elements( Box Plot( X, Y, Legend( 4 ), Box Type( "Quantile" ) ) )
);
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Um das gewünschte Diagramm zu erstellen, waren nur sehr geringfügige Änderungen erforderlich.
Die JSL, die vom ersten Skript erstellt wird, das den Graph Builder ausführt, ist
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 2 ) ) ),
Elements( Position( 1, 3 ), Points( X, Y, Legend( 3 ) ) ),
Elements( Position( 1, 4 ), Points( X, Y, Legend( 4 ) ) )
);
Wenn man sich die JSL ansieht, die den obigen Graph Builder-Code erstellt hat, erledigen nur zwei Abschnitte die eigentliche Arbeit.
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Erstellt die Shell für den Graph Builder
Graph Builder(
Show Control Panel( 0 ),
);
Die JSL
variables_expr = Expr(Variables(X(:lot_id)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
Erzeugt den Code
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) )
Dann,
Insert Into(gb_expr, Name Expr(variables_expr));
Fügt die Variables( X(.................) JSL in den Graph Builder()-Code ein
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) )
);
Jetzt gilt es zu bauen
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 2 ) ) ),
Elements( Position( 1, 3 ), Points( X, Y, Legend( 3 ) ) ),
Elements( Position( 1, 4 ), Points( X, Y, Legend( 4 ) ) )
Die JSL, die diese Codezeilen erstellt, ist
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Es durchläuft jeden der Y-Werte, erstellt nacheinander die Elements-Zeile und fügt sie in die Graph Builder()-JSL ein.
Endlich,
Eval(gb_expr);
Führt die fertige Graph Builder-JSL aus
Nun also, was muss geändert werden?
Wenn man sich die Unterschiede zwischen der JSL, die das ursprüngliche Skript erstellt, und der gespeicherten JSL aus dem Graph Builder mit den neuen Änderungen ansieht, sieht man in der ursprünglichen Skriptausgabe grundsätzlich die Elements-Struktur
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) )
Wobei der Abschnitt „Elemente“ des gespeicherten Codes einen Abschnitt für Punkte und einen Boxplot enthält
Elements(
Position( 1, 1 ),
Points( X, Y, Legend( 1 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 5 ), Jitter( "None" ) )
)
Daher muss lediglich dieser zweite Abschnitt zum Code hinzugefügt werden, der den Abschnitt „Elemente“ generiert.
For Each( {y_col, idx}, y_values,
Eval(
Eval Expr(
Insert Into(
gb_expr,
Name Expr(
Elements(
Position( 1, Expr( idx ) ),
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ) ),
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
)
)
)
)
)
);
Wenn man das alles zusammenfügt, ergibt sich das neue Skript
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" );
y_values = {"NPN1", "IVP1", "PNP4", "NPN4"};
variables_expr = Expr(
Variables( X( :lot_id ) )
);
For Each( {y_col}, y_values,
temp_expr = Expr( Y() );
Insert Into( temp_expr, Name Expr( As Column( dt, y_col ) ) );
Insert Into( variables_expr, Name Expr( temp_expr ) );
);
gb_expr = Expr(
Graph Builder( Show Control Panel( 0 ) )
);
Insert Into( gb_expr, Name Expr( variables_expr ) );
For Each( {y_col, idx}, y_values,
Eval(
Eval Expr(
Insert Into(
gb_expr,
Name Expr(
Elements(
Position( 1, Expr( idx ) ),
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ) ),
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
)
)
)
)
)
);
Show( Name Expr( gb_expr ) );
Eval( gb_expr );Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?@txnelson Danke.
Ich wäre nicht so leicht darauf gekommen.
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
Wie ändere ich die Standardmarkierungen in Points so, dass sie ein „+“ oder ein „Quadrat“ sagen? Das reicht nicht aus
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ), marker ("square") )Wechseln Marker zeigt interaktiv an, dass ich die Markierungsänderung über sendToReport() für jede Y-Variable steuern muss. Wie macht man das auf einmal für alle Y-Variablen?
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Je nachdem, wo Sie es tun, wo Sie sehen, was anders sein wird. Hier ist ein Beispiel, wenn Sie es von Legend aus machen:
Wenn Sie die Legende ändern, erhalten Sie so etwas wie
{Legend Model(4, Properties(0, {Marker("Circle")}, Item ID("NPN4", 1)))}
Suchen Sie daher im Scripting Index nach dem Legend Model

Holen Sie sich das Skript von dort, ändern Sie es entsprechend Ihren Anforderungen, halten Sie es jedoch so einfach wie möglich (fügen Sie eine zweite Y-Achse hinzu) und testen Sie es
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(528, 448),
Show Control Panel(0),
Variables(X(:sex), Y(:height), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(3))),
Elements(Position(1, 2), Points(X, Y, Legend(1)))
);
server = gb << Get Legend Server;
item = server << Get Legend Item(1, 1);
item << Set Properties({Marker("Circle")});
Sie haben es geschafft, die Markierungen auf einer Parzelle zu ändern. Dann fragen Sie: Wie ändere ich sie auf allen Parzellen? Sehen Sie sich dann das Skript genauer an und es sieht so aus, als ob einige Indizes bereitgestellt werden
item = server << Get Legend Item(1, 1);
Aktivieren Sie << Legendenelement aus dem Skriptindex abrufen und hoffen Sie, dass es vorhanden ist. Wenn nicht, erkunden Sie andere Legendenobjekte und hoffen Sie, dass sie auf ähnliche Weise funktionieren (oder versuchen Sie einfach, Nachrichten an den Server zu senden << Lege abrufen Strg+Leertaste Hier).
server << Get Legend Items;
{{LegendModelItem(Label("height"), Type("Marker"))},
{LegendModelItem(Label("weight"), Type("Marker"))}}
Jetzt haben Sie eine Liste mit Legendenelementen. Versuchen Sie, diese Liste durchzugehen und zu sehen, was passiert
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(528, 448),
Show Control Panel(0),
Variables(X(:sex), Y(:height), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(3))),
Elements(Position(1, 2), Points(X, Y, Legend(1)))
);
server = gb << Get Legend Server;
For Each({item}, server << Get Legend Items,
item << Set Properties({Marker("Circle")});
);
Eine einfachere Option besteht darin, die Markierungen als Zeilenzustände für Ihre Datentabelle festzulegen, wenn das für Sie funktioniert.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?@jthi Danke. Gibt es eine Möglichkeit, die Markierungen zu ändern, wenn die Punkte zuerst geplottet werden, anstatt später ein Handle zum Legendenserver zu erhalten und dann die Markierungen für jede Y-Variable zu ändern?
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Gibt es einen Grund, warum sie danach nicht mehr geändert werden konnten?
Sie könnten SendToReport verwenden und das Legend-Modell innerhalb des Dispatch-Teils mit ähnlichen Ideen erstellen, wie andere Teile in Ihrem Skript erstellt wurden.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?@jthi Sicherlich könnten die Dinge später geändert werden. Das Ändern der Markierungen während des Plottens der Punkte schien mir eine einfachere Lösung zu sein.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?@jthi @txnelson Im Hauptskript unten habe ich Local Data Filter() unter Eval() hinzugefügt, was wie vorgesehen funktioniert
Eval( gb_expr <<LOCAL data="https://community.jmp.com/" filter=""></LOCAL>
aber wenn ich das Skript zum Aktualisieren der Markierungen hinzufüge, wird das Diagramm zweimal gezeichnet!
Eval(
server = gb_expr << Get Legend Server;
For Each( {item}, server << Get Legend Items, item << Set Properties( {Marker( "Circle" )} ) );
);<BR />
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" );
y_values = {"NPN1", "IVP1", "PNP4", "NPN4"};
variables_expr = Expr(
Variables( X( :lot_id ) )
);
For Each( {y_col}, y_values,
temp_expr = Expr( Y() );
Insert Into( temp_expr, Name Expr( As Column( dt, y_col ) ) );
Insert Into( variables_expr, Name Expr( temp_expr ) );
);
gb_expr = Expr(
Graph Builder( Show Control Panel( 0 ) )
);
Insert Into( gb_expr, Name Expr( variables_expr ) );
For Each( {y_col, idx}, y_values,
Eval(
Eval Expr(
Insert Into(
gb_expr,
Name Expr(
Elements(
Position( 1, Expr( idx ) ),
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ) ),
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
)
)
)
)
)
);
//Show( Name Expr( gb_expr ) );
Eval( gb_expr <<LOCAL data="https://community.jmp.com/" filter=""></LOCAL>Das zweite Diagramm enthält die aktualisierten Markierungen.
Wie zeichne ich ein einzelnes Diagramm mit den aktualisierten Markierungen zusammen mit dem lokalen Datenfilter?
Ich schätze, ich schaffe es nicht, das letzte Teil für den Markiererwechsel richtig zu platzieren, wo ich um Hilfe bitte.
Betreff: Wie füge ich Boxplots zu Punkten hinzu, wenn Y-Variablen als Liste für den Diagrammersteller bereitgestellt werden?Sie möchten gb_expr nicht zweimal ausführen. Sie möchten die Referenz erhalten, die Sie von gb_expr erhalten, und diese Nachrichten daran senden
gb = Eval( gb_expr );
gb << Local data Filter(...)
server = gb << get legend server;