Tengo un código "sample.jsl" que tiene un bucle para crear un gráfico bi-var para cada columna. Estoy tratando de agregar un cuadro deslizante de rango a este bucle para que, una vez que ejecute el script, cree un gráfico para todas las columnas con un cuadro deslizante de rango separado para cada gráfico.
Los límites para todas las columnas del eje x están en "limits.jmp" y el archivo de datos es "Data.jmp". El código "sample.jsl" crea un gráfico para cada uno de los parámetros a la vez. Quiero modificar el código para que también agregue un cuadro deslizante de rango a todos los gráficos.
El cuadro deslizante de rango debe tener los límites de control superiores (ucl) y lcl como los dos controles deslizantes dinámicos.
Tengo este código que crea el cuadro deslizante de rango, pero solo funciona para un solo gráfico. Necesito un script que cree todos los gráficos junto con los cuadros deslizantes de rango dinámico.
Cualquier ayuda sería apreciada. Gracias por adelantado
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
Gracias por explicar esto.
Sí, tengo experiencia en python y soy nuevo en jsl. Aprendiendo sobre la marcha.
OP, esto se puede hacer con relativa facilidad, pero no creo que muchas personas quieran ayudarlo con esto, ya que está pidiendo demasiado y parece ser demasiado inexperto para entenderlo realmente todo.
Algunas cosas a tener en cuenta mientras completa su nivel de experiencia aquí son las siguientes
- JSL realmente no hace mucho control de alcance automático, en particular, no recuerda estados de alcance y jerarquías para funciones y demás, si está acostumbrado a Python, por ejemplo, entonces JSL será bastante frustrante y lo hará genial. dolores hasta que internalices esto y comiences a hacer todo tu propio control de alcance
- para múltiples interactivo y en su mayoría elementos idénticos (como gráficos con cuadros deslizantes, donde solo cambia el gráfico X/Y / Agrupación), las expresiones no le servirán bien.En su lugar, use un generador de funciones o algo así, ya que necesitará distinguir los cuadros deslizantes y a qué objeto se vinculan.Por supuesto, esto se puede hacer con expresiones, pero en general es la configuración más complicada con ganancias de velocidad insignificantes en la mayoría de las circunstancias.
- Comience de a poco, con solo un gráfico y un rangeSliderBox.Obtenga información sobre cómo vincularlos mediante el alcance explícito
- Necesitará una tabla de datos separada para cada gráfico, ya que una tabla solo puede tener un estado de fila por fila.
- Con esto, si crea varias subtablas para cada gráfico, sería mejor hacerlas invisibles para evitar que el usuario se inunde con tablas de datos.Pero tenga en cuenta que la tabla de datos JMP nunca los elimina implícitamente .Debe vincular el cierre de la ventana con la limpieza del script: cierre todas las tablas de datos relevantes y elimine los espacios de nombres utilizados para el alcance.
- Muchas personas en las páginas de la comunidad aquí están dispuestas a ayudar, pero las preguntas deben ser pequeñas y breves.
Aquí hay un ejemplo de cómo afecta algunas líneas de referencia con un cuadro deslizante para cada lista. No elimina la línea de referencia anterior, por lo que tendría que averiguar cómo quiere hacerlo si eso es lo que busca.
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>Los gráficos funcionan bien y se agregan a la nueva ventana. Pero no puedo agregar un objeto de cuadro deslizante de rango () a cada uno de los gráficos creados usando el bucle;.
Puede intentar crear una ventana primero con un cuadro de lista vacío donde desea que vayan los gráficos y luego agregar sus gráficos a ese cuadro de lista usando un bucle for.
Creo que el mensaje que publicaste no se muestra.