Ich habe einen Code "sample.jsl", der eine Schleife zum Erstellen eines Bi-Var-Plots für jede Spalte enthält. Ich versuche, dieser Schleife ein Bereichsschiebereglerfeld hinzuzufügen, damit nach dem Ausführen des Skripts ein Diagramm für alle Spalten mit einem separaten Bereichsschiebereglerfeld für jedes Diagramm erstellt wird.
Die Grenzen für alle x-Achsen-Spalten befinden sich in "limits.jmp" und die Datendatei ist "Data.jmp". Der Code "sample.jsl" erstellt für alle Parameter gleichzeitig jeweils einen Graphen. Ich möchte den Code so ändern, dass er allen Diagrammen auch ein Bereichsschiebereglerfeld hinzufügt.
Der Bereichsschieberegler sollte die oberen Kontrollgrenzen (ucl) und lcl als die beiden dynamischen Schieberegler haben.
Ich habe diesen Code, der den Bereichsschieberegler erstellt, aber er funktioniert nur für ein einzelnes Diagramm. Ich brauche ein Skript, das alle Diagramme zusammen mit den Schiebereglern für den Dynamikbereich erstellt.
@txnelson
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
Ich glaube, die von Ihnen gepostete Nachricht wird nicht angezeigt?
Sie können versuchen, zuerst ein Fenster mit einem leeren Listenfeld zu erstellen, in das die Diagramme eingefügt werden sollen, und dann Ihre Diagramme mit einer for-Schleife an dieses Listenfeld anhängen.
Die Grafiken funktionieren einwandfrei und werden in das neue Fenster angehängt. Aber ich bin nicht in der Lage, jedem der mit der Schleife erstellten Diagramme ein Objekt für den Bereichsschieberegler box() hinzuzufügen.
Hier ist ein Beispiel dafür, wie es einige Referenzlinien mit einem Schieberegler für jede Liste betrifft. Es löscht nicht die vorherige Referenzzeile, also müssten Sie 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>OP, das kann relativ einfach gemacht werden, aber ich glaube nicht, dass viele Leute Ihnen dabei helfen wollen, da Sie zu viel verlangen und zu unerfahren zu sein scheinen, um alles wirklich zu verstehen.
Einige Dinge, die Sie beim Ausfüllen Ihres Erfahrungslevels hier beachten sollten, sind die folgenden
- JSL macht nicht wirklich viel automatische Bereichssteuerung – insbesondere merkt es sich nicht Bereichszustände und Hierarchien für Funktionen und dergleichen – wenn Sie zum Beispiel an Python gewöhnt sind, wird JSL ziemlich frustrierend sein und Sie großartig machen Schmerzen, bis Sie dies verinnerlichen und anfangen, Ihre gesamte Kontrolle über den Umfang zu übernehmen
- Für mehrere interaktiv und meistens identische Elemente (wie Diagramme mit Schiebereglern, bei denen sich nur das Diagramm X/Y / Gruppierung ändert), werden Ihnen Ausdrücke keine guten Dienste leisten.Verwenden Sie stattdessen einen Funktionsgenerator oder ähnliches, da Sie die Schieberegler 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 mit explizitem 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 mehrere Untertabellen für jeden Plot erstellen, ist es am besten, sie unsichtbar zu machen, um zu verhindern, dass der Benutzer mit Datentabellen überschwemmt wird.Aber denken Sie an diese Datentabelle werden niemals implizit von JMP gelöscht .Sie müssen das Schließen des Fensters an die Bereinigung des Skripts binden – schließen Sie alle relevanten Datentabellen und löschen Sie alle Namespaces, die für das Scoping verwendet werden.
- Viele Leute auf den Community-Seiten hier sind bereit zu helfen, aber Fragen sollten klein und prägnant sein.