Ho un codice "sample.jsl" che ha un ciclo per creare un grafico bi-var per ogni colonna. Sto cercando di aggiungere una casella di scorrimento dell'intervallo a questo ciclo in modo che una volta eseguito lo script crei un grafico per tutte le colonne con una casella di scorrimento dell'intervallo separata per ciascun grafico.
I limiti per tutte le colonne dell'asse x sono in "limits.jmp" e il file di dati è "Data.jmp". Il codice "sample.jsl" crea un grafico ciascuno per tutti i parametri contemporaneamente. Voglio modificare il codice in modo che aggiunga anche una casella di scorrimento dell'intervallo a tutti i grafici.
La casella del dispositivo di scorrimento dell'intervallo dovrebbe avere i limiti di controllo superiori (ucl) e lcl come i due dispositivi di scorrimento dinamici.
Ho questo codice che crea la casella di scorrimento dell'intervallo ma funziona solo per un singolo grafico. Ho bisogno di uno script che crei tutti i grafici insieme alle caselle di scorrimento della gamma dinamica.
@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
Penso che il messaggio che hai postato non venga visualizzato?
Potresti provare a creare prima una finestra con una casella di riepilogo vuota in cui desideri inserire i grafici, quindi aggiungere i tuoi grafici a quella casella di riepilogo utilizzando un ciclo for.
I grafici funzionano correttamente e vengono aggiunti nella nuova finestra. Ma non sono in grado di aggiungere un oggetto range slider box() a ciascuno dei grafici creati utilizzando il loop;.
Ecco un esempio di come interessa alcune linee di riferimento con uno slider per ogni elenco. Non elimina la linea di riferimento precedente, quindi dovresti capire come vuoi farlo se è quello che stai cercando.
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, questo può essere fatto in modo relativamente semplice, ma non credo che molte persone vorranno aiutarti in questo perché stai chiedendo troppo e sembri troppo inesperto per capire davvero tutto.
Alcune cose da esaminare mentre stai compilando il tuo livello di esperienza qui sono le seguenti
- JSL non fa molto controllo automatico dell'ambito -- in particolare, non ricorda gli stati dell'ambito e le gerarchie per funzioni e simili -- se ad esempio sei abituato a Python, allora JSL sarà piuttosto frustrante e ti darà grande dolori fino a quando non interiorizzi questo e inizi a fare tutto il tuo controllo dell'ambito
- Per multipli interattivo e per lo più elementi identici (come i grafici con caselle di scorrimento, in cui cambiano solo il grafico X/Y / Raggruppamento), le espressioni non ti serviranno bene.Usa invece un generatore di funzioni o qualcosa del genere poiché dovrai distinguere le caselle di scorrimento e l'oggetto a cui si collegano.Ovviamente questo può essere fatto con le espressioni, ma in generale è l'impostazione più complicata con guadagni di velocità solo trascurabili nella maggior parte dei casi
- Inizia in piccolo, con un solo grafico e un rangeSliderBox.Scopri come collegarli utilizzando l'ambito esplicito
- Avrai bisogno di una tabella di dati separata per ogni grafico poiché una tabella può avere solo uno stato di riga per riga
- Con questo, se crei più sottotabelle per ogni grafico, sarebbe meglio renderle invisibili per evitare che l'utente venga inondato di tabelle di dati.Ma tieni presente quella tabella di dati non vengono mai eliminati implicitamente da JMP .È necessario collegare la chiusura della finestra alla pulizia dello script: chiudere tutte le tabelle di dati rilevanti ed eliminare tutti gli spazi dei nomi utilizzati per l'ambito.
- Molte persone nelle pagine della community qui sono disposte ad aiutare, ma le domande dovrebbero essere piccole e concise.