Actualizar la línea de referencia del eje de la columna en función de los datos de otra tabla de datosEstoy buscando agregar líneas de referencia de columna basadas en datos de otra capacidad de datos. Un ejemplo, el uso de "Clase grande" actualizaría las columnas "peso" y "altura" con valores P50 y P95 de una tabla de datos de búsqueda.
Las filas de la tabla de datos de búsqueda corresponden a los nombres de las columnas de la tabla principal. Las líneas de referencia tendrían que asignar el valor de la etiqueta del nombre de columna de la tabla de búsqueda "P50" o "P95" y el valor es de la fila de esa columna.
Ejemplo que muestra las líneas de referencia del eje de la columna agregadas:

Ejemplo de tabla de datos de búsqueda:

No estoy muy versado en JSL, así que agradezco cualquier ayuda que me llegue en este tema. He creado un script pero no está haciendo lo que quiero.
Parece corromper la columna, a veces, al trazar una distribución, muestra todos los valores '0'. Además, si intento agregar líneas de referencia P50 y P95, solo la última se guarda en la columna y se guarda en ambas columnas.
dt = Open ("C:\Program Files\SAS\JMP\15\Samples\Data\big class.jmp");
dtLookup = New Table( "Lookup Table",
Add Rows( 2 ),
New Column( "Column Name",
Character,
Nominal,
Set Values( {"weight", "height"} )
),
New Column( "P50",
"Continuous",
Set Values( [100, 61] )
),
New Column( "P95",
"Continuous",
Set Values( [120, 70] )
)
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
numRowsLookup = N Rows( dtLookup );
numColsLookup = N Cols( dtLookup );
for(n=1,n<=numRowsLookup,n++,
col_name = dtLookup[n,1];
If(contains(col_name_list,col_name),
for(j=2,j<=numColsLookup,j++,
col = Column(dt, col_name);
col_name_Lookup = col_name_list_lookup[j];
value = Column(dtLookup,col_name_Lookup)[n];
col <<
Set Property("Axis",
{
//Add Ref Line( 63, "Dashed", "Orange", "P50", 2 )
Add Ref Line( value, "Dashed", "Orange", col_name_Lookup, 2 )
});
);
);
);
Gracias,
roger
secuencias de comandosRe: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosÚltima actualización aquí. Un agradecimiento especial a Jarmo.
Pude hacer que esto funcionara según lo previsto. Código final aquí para referencia futura.
Names Default To Here(1);
namespace("here")<<REMOVE></REMOVE> New Column("P99", "Continuous", Set Values([125, 75]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Analysis Columns"n; //Ref column name
new_properties = {}; // re-init
old_properties = {}; // re-init
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//Add Multiple Ref Lines
For( i = 2, i <= N Items( col_name_list_lookup ), i++,
new_properties_temp =
EvalExpr({
Add Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 67 )),Expr(char(col_name_list_lookup[i])), 1)
});
new_properties = Insert(new_properties, new_properties_temp);
);
//end Add Multiple
//Add Specified Reference Lines
//new_properties = EvalExpr({
// Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
// Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
//});
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
//show(prop_to_add); // for debug
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Applies the new axis settings.
);
);
Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosHola Jarmo,
Agradezco la ayuda en esto. Desafortunadamente, no estaba viendo que las propiedades del eje antiguo y nuevo se actualizaran aquí. Vi que la lista "prop_to_add" se agrega con propiedades antiguas y nuevas, pero cuando verifico la configuración real del eje, solo vi las dos propiedades nuevas.
Después de quitar las llaves de las propiedades establecidas, ¡pudo funcionar como se esperaba!
Ahora solo necesito trabajar para hacer que esto funcione en N número de columnas de búsqueda.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
//stop();
For Each Row(dtLookup,
//stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
//stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
//stop();
//Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)}))); // Didn't work with the braces.
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Worked when removing the braces.
);
);Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosPodría intentar depurar el código en partes. Puede "ejecutar" For Each Row con fila por fila usando Row() = número de fila en lugar del bucle.
//For Each Row(dtLookup,
Row() = 1;
col_name =:"Column Name"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);
Y luego comience a ejecutar el código fila por fila:
old_properties = Column(dt, col_name) << get property("Axis");
//Empty()
Algunos puntos de interrupción para la depuración (no uso Debugger, pero lo más probable es que sea aún más fácil):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
stop();
For Each Row(dtLookup,
stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
stop();
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)})));
);
);
Índice de secuencias de comandos para insertar:

Algunos enlaces para ayudar con las secuencias de comandos:
Referencia de sintaxis JSL
Guía de secuencias de comandos
Ayuda JMP 16
Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datos¿Qué hace aquí la función Insert()? Parece que no puedo hacerlo funcionar.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Column Names"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosNo estoy 100% seguro, pero tal vez primero podría obtener las propiedades antiguas de Axis con << Get Propery("Axis") y luego agregarlas.
Tal vez algo como esto (también podría haber formas más simples):
old_properties = Column(dt, "height") << get property("Axis");
old_with_new = Insert(old_properties, Expr(Add Ref Line(1, "Dashed", "Orange", "P45", 2)));
Eval(EvalExpr(column(dt, "height") << Set Property("Axis",{expr(old_with_new)})));Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosGracias Jarmo. Esta solución es mucho más simple, pero parece sobrescribir cualquier línea de referencia del eje existente. ¿Sabe si hay alguna manera de conservar las líneas de referencia del eje que ya están presentes en esa columna?
Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosAquí hay un guión de ejemplo. Supongo que el eje se anula si intenta hacerlo varias veces así, por lo que es posible que deba agregarlos en el mismo << Establecer propiedad (múltiples formas diferentes de construir la expresión para hacerlo).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
For Each Row(dtLookup,
col_name =:"Column Name"n;
//because we know we have only two lines to add and they are always added
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis", {
Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
}))
);
);

No estoy seguro si Evaluación(ExprEval()) es necesario aquí pero no dolerá.
Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosUn script JSL es muy útil para importar datos directamente a Axis. ¿Es posible añadir la siguiente configuración de etiqueta al script JSL anterior?
Intento agregar/modificar su código con una configuración adicional y aparece un error.
Para (i = 2, i <= N elementos (col_name_list_lookup), i++,
nuevas_propiedades_temp =
EvalExpr({
Agregar línea de referencia (Expr (como columna (dtLookup, col_name_list_lookup[i])), "Discontinua", Expr (Color a RGB (0)), Expr (char (col_name_list_lookup[i])), 1,
Posición de la etiqueta ( "Dentro de la línea"), Eje opuesto (1)
)
});
nuevas_propiedades = Insertar(nuevas_propiedades, nuevas_propiedades_temp);
);

Re: Actualizar la línea de referencia del eje de la columna según los datos de otra tabla de datosAsegúrese de que todos los soportes estén en la posición correcta
Ver más...
For(i = 2, i <= N Items(col_name_list_lookup), i++,
new_properties_temp = Eval Expr(
{Add Ref Line(
Expr(As Column(dtLookup, col_name_list_lookup[i])),
"Dashed",
Expr(Color To RGB(0)),
Expr(Char(col_name_list_lookup[i])),
1,
Label Position("Inside Inline"),
Opposite Axis(1)
)}
);
new_properties = Insert(new_properties, new_properties_temp);
);