Ich habe einen Code „sample.jsl“, der eine Schleife zum Erstellen eines Bi-Var-Diagramms für jede Spalte enthält. Ich versuche, dieser Schleife ein Bereichsschiebereglerfeld hinzuzufügen, sodass nach dem Ausführen des Skripts ein Diagramm für alle Spalten mit einem separaten Bereichsschiebereglerfeld für jedes Diagramm erstellt wird.
Die Grenzwerte für alle X-Achsen-Spalten befinden sich in „limits.jmp“ und die Datendatei ist „Data.jmp“. Der Code „sample.jsl“ erstellt jeweils ein Diagramm für alle Parameter auf einmal. Ich möchte den Code so ändern, dass allen Diagrammen auch ein Bereichsschiebereglerfeld hinzugefügt wird.
Das Bereichsschiebereglerfeld sollte die oberen Kontrollgrenzen (ucl) und lcl als die beiden dynamischen Schieberegler haben.
Ich habe diesen Code, der das Bereichsschiebereglerfeld erstellt, aber er funktioniert nur für ein einzelnes Diagramm. Ich benötige ein Skript, das alle Diagramme zusammen mit den Schiebereglern für den Dynamikbereich erstellt.
Jede Hilfe wäre dankbar. Vielen Dank im Voraus
myFinalDisplay = expr(
myLimitCol = column(dt, "ColA"); //new
myLimitMin = colMinimum(myLimitCol); show(myLimitMin); //new
myLimitMax = colMaximum(myLimitCol); show(myLimitMax); //new
mylcl = globalLCL["ColA];
myucl = globalUCL["ColA];
myGbDispObj = dt << Bivariate(
Size( 550, 400 ),
Y( "res" ),
X( "ColA" ),
Automatic Recalc( 1 ),
Histogram Borders( 1 ),
Summary Statistics( 1 ),
Fit Spline( 2, {Line Color( {212, 73, 88} )} ),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Row Legend(
"Grouping",
Color( 1 ),
Color Theme( "JMP Default" ),
Marker( 1 ),
Marker Theme( "Solid" ),
Continuous Scale( 1 ),
Reverse Scale( 0 ),
Excluded Rows( 0 )
)}
),
Dispatch(
{},
"1",
ScaleBox,
{Add Ref Line({mylcl, myucl}, "Solid", "Light YellowGreen", "", 1, 0.20 )}
),
Dispatch( {}, "Summary Statistics", OutlineBox, {Close( 1 )} )
)
);
myTbLo = textBox(Char(round(myLimitMin, 2)) || " (OOC = " || char(0.00, 10, 2) || "%)");
myTbHi = textBox(Char(round(myLimitMax, 2)) || " (OOC = " || char(0.00, 10, 2) || "%)");
mySbDispObj = rangeSliderBox();
mySbDispObj = rangeSliderBox(
myLimitMin,
myLimitMax,
mylcl,
myucl,
//script
mySelectedLower = mySbDispObj << getLower;
mySelectedUpper = mySbDispObj << getUpper;
myGbDispObj << Dispatch( {}, "1", ScaleBox, {Add Ref Line( mySelectedLower, "Dashed", "blue", "LCL", 4 )} );
myGbDispObj << Dispatch( {}, "1", ScaleBox, {Add Ref Line( mySelectedUpper, "Dashed", "blue", "UCL", 4 )} );
rUpper = dt << Get Rows Where( myLimitCol[] > mySelectedUpper );
OOC_valUpper = (N Items(rUpper) / Col Number( Column(dt, "ColA") ))*100;
myTbHi << setText(Char(round(mySelectedUpper, 1)) || " (OOC = " || char(OOC_valUpper, 10, 2) || "%)");
rLower = dt << Get Rows Where( myLimitCol[] < mySelectedLower );
OOC_valLower = (N Items(rLower) / Col Number( Column(dt, "ColA") ))*100;
myTbLo << setText(Char(round(mySelectedLower, 1)) || " (OOC = " || char(OOC_valLower, 10, 2) || "%)");
);
mySbDispObj << Set Width( 275 );
myLayout = vListBox(
myGbDispObj,
hListBox(myTbLo, spacerBox(size(50,0)), myTbHi),
mySbDispObj
);
);@pmroz
@txnelson
Vielen Dank für die Erklärung.
Ja, ich habe Erfahrung in Python und bin neu in JSL. Unterwegs lernen.
scheint mir klar genug zu sein
OP, das geht relativ einfach, aber ich glaube nicht, dass dir viele Leute dabei helfen wollen, da du zu viel verlangst und zu unerfahren zu sein scheinst, um alles wirklich zu verstehen.
Einige Dinge, auf die Sie beim Ausfüllen Ihres Erfahrungsniveaus achten sollten, sind die folgenden
- JSL führt nicht wirklich viel automatische Bereichskontrolle durch – insbesondere merkt es sich keine Bereichszustände und Hierarchien für Funktionen und dergleichen – wenn Sie beispielsweise mit Python vertraut sind, wird JSL ziemlich frustrierend sein und Ihnen große Freude bereiten Es schmerzt, bis Sie dies verinnerlichen und anfangen, Ihre gesamte Scope-Kontrolle selbst durchzuführen
- Für mehrere interaktiv und größtenteils identische Elemente (wie Diagramme mit Schiebereglern, bei denen sich nur die Diagramm-X/Y/Gruppierung ändert), werden Ihnen Ausdrücke keine guten Dienste leisten.Verwenden Sie stattdessen einen Funktionsgenerator oder etwas Ähnliches, da Sie die Schiebereglerboxen und das Objekt, mit dem sie verknüpft sind, unterscheiden müssen.Natürlich kann dies mit Ausdrücken erfolgen, aber im Allgemeinen ist es das kompliziertere Setup mit nur vernachlässigbaren Geschwindigkeitsgewinnen in den meisten Fällen
- Fangen Sie klein an, mit nur einem Diagramm und einer rangeSliderBox.Erfahren Sie, wie Sie sie durch explizites Scoping verknüpfen
- Sie benötigen für jedes Diagramm eine separate Datentabelle, da eine Tabelle nur einen Zeilenstatus pro Zeile haben kann
- Wenn Sie also für jedes Diagramm mehrere Untertabellen erstellen, ist es am besten, diese unsichtbar zu machen, um zu verhindern, dass der Benutzer mit Datentabellen überflutet wird.Aber denken Sie an die Datentabelle werden von JMP niemals implizit gelöscht .Sie müssen das Schließen des Fensters mit der Bereinigung des Skripts verknüpfen – schließen Sie alle relevanten Datentabellen und löschen Sie alle für die Festlegung des Gültigkeitsbereichs verwendeten Namespaces.
- Viele Leute auf den Community-Seiten hier sind bereit zu helfen, aber die Fragen sollten kurz und prägnant sein.
Hier ist ein Beispiel dafür, wie sich dies auf einige Referenzlinien mit einem Schieberegler für jede Liste auswirkt. Die vorherige Referenzzeile wird dadurch nicht gelöscht, Sie müssen also herausfinden, wie Sie das machen wollen, wenn Sie das wollen.
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age)); // just some list
nw = new window("Some box");
for(i=1, i<=nitems(ages), i++,
olb = outlinebox("Age = " || char(ages[i]),
hlistbox(
rsb = rangesliderbox(colmin(:height), colmax(:height), colquantile(:height, .25), colquantile(:height, .75)),
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
where(char(:age) == ages[i])
);
)
);
(gb<<PARENT></PARENT>Die Diagramme funktionieren einwandfrei und werden in das neue Fenster eingefügt. Ich kann jedoch nicht zu jedem der mit der Schleife erstellten Diagramme ein Bereichsschieberegler-Box()-Objekt hinzufügen.
Sie könnten versuchen, zunächst ein Fenster mit einem leeren Listenfeld zu erstellen, in das die Diagramme verschoben werden sollen, und dann Ihre Diagramme mithilfe einer for-Schleife an dieses Listenfeld anzuhängen.
Ich glaube, die von Ihnen gepostete Nachricht wird nicht angezeigt?