¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?En el gráfico generado por el siguiente script, me gustaría cambiar el color de las líneas indicadas por las flechas rojas ("las líneas separadoras") a violeta. También me gustaría agregar una línea de referencia horizontal solo para la variable más baja del eje y (en este caso PNP1).
¿Cómo hacer esto a través de JSL?
(Tenga en cuenta que en mi caso real los datos del eje y no provienen de una columna a diferencia de este caso de ejemplo)
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
Graph Builder(
Size( 960, 695 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch(
{},
"SITE",
ScaleBox,
{Label Row( 3, {Major Grid Line Color( 8 ), Show Major Grid( 1 )} )}
)
)
);
Automatización y secuencias de comandosventanasRe: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?Buena idea para vincular las líneas verticales y las etiquetas de los ejes mediante colores 
Desafortunadamente, las líneas son tan finas que es difícil notar la característica.
Si tienes el mismo sentimiento, apoya este deseo:
configuración de gráficos optimizada para categorías X jerárquicas - 2 opciones

alternativamente, puede usar el sitio como Grupo X, pero lo más probable es que se encuentre con el problema con las etiquetas sincronizadas del eje X.
También existe el deseo de solucionar este problema:
Grupo X: restringe los valores en el eje al grupo respectivo
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt << Graph Builder(
Size( 841, 485 ),
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis Title( 0 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch( {}, "SITE", ScaleBox,
{Label Row(
1,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
2,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
3,
{Line Color( "Purple" ), Lower Frame( 1 ), Major Grid Line Color( "Purple" ),
Row Title Side( "Start" ), Tick Mark Style( "Long Divider" )}
)}
),
Dispatch( {}, "PNP1", ScaleBox, {Add Ref Line( 300, "Solid", "Black", "", 5 )} ),
Dispatch( {}, "Graph Builder", FrameBox( 4 ), {Reference Line Order( 3 )} )
)
)
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?a qué te refieres con
@neo escribió:(Tenga en cuenta que en mi caso real los datos del eje y no provienen de una columna a diferencia de este caso de ejemplo)
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?@hogi
>> (Tenga en cuenta que en mi caso real los datos del eje y no provienen de una columna a diferencia de este caso de ejemplo)
En mi caso real, los parámetros del eje y provienen de la selección del filtro de datos local de los parámetros de fila.
(Si fuera de una columna, podría haber establecido un límite en las especificaciones para la línea de referencia (no es que haya probado esto, pero espero que funcione))
Déjame ver si puedo preparar un conjunto de datos para una demostración (volveré
).
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?Hola @neo ,
El código que @hogi publicado resolverá su problema para obtener una línea de referencia para una única subtrama dentro de su generador de gráficos, pero desafortunadamente, al observar la estructura del árbol, no veo una manera de enviar un comando que cambiaría solo esa línea de la x- eje. En la estructura de árbol, todo el eje x está agrupado en un único elemento AxisBox(1), no está dividido ni anidado, aunque se muestra de esa manera en el generador de gráficos. Tampoco pude encontrar nada dentro de las preferencias que le permita modificar las líneas de los ejes anidados.
Siempre puede hacer clic derecho en un eje que desee tener y luego agregar una línea de referencia, luego ir al botón rojo al lado del generador de gráficos y guardar el script en la ventana de scripting, y podrá ver cómo el script modifica el script. adición de la línea.
¡Espero que esto ayude!,
DS
Editar: podría valer la pena enviar una solicitud para poder cambiar los colores de los ejes anidados. Esto debería ser factible y algo de lo que imagino que mucha gente podría beneficiarse.
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?¿Qué línea es el problema?
Por el momento, solo hay una línea horizontal en el gráfico más bajo.
Si tiene que ocultar partes de las líneas de referencia, puede aprovechar el hecho de que cada subtrama tiene su propia configuración de personalización, por lo que puede agregar algunos rectángulos y colocarlos delante de la línea de referencia.
[como alternativa, también puede utilizar directamente el script de personalización para agregar un segmento de línea.]

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt << Graph Builder(
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis Title( 0 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch( {}, "SITE", ScaleBox,
{Add Ref Line( 714.422378299564, "Solid", "Red", "", 4 ),
Label Row(
1,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
2,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
3,
{Line Color( "Purple" ), Line Width( 3 ), Lower Frame( 1 ),
Major Grid Line Color( "Purple" ), Row Title Side( "Start" ),
Tick Mark Style( "Long Divider" )}
)}
),
Dispatch( {}, "PNP3", ScaleBox, {Add Ref Line( 135, "Solid", "Red", "", 3 )} ),
Dispatch( {}, "PNP1", ScaleBox, {Add Ref Line( 300, "Solid", "Black", "", 5 )} ),
Dispatch( {}, "400", ScaleBox,
{Legend Model( 38, Properties( 0, {Transparency( 0.5 )}, Item ID( "PNP3", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox,
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( -10000, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 2 ),
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( -10000, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 3 ),
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( 290, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 4 ), {Reference Line Order( 3 )} )
)
)
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?@hogi @SDF1 Se adjunta una tabla de datos preparada (con un guión de trama en su interior) similar a mis datos reales. Quiero que aparezca una línea de referencia (roja abajo) solo cuando se selecciona la etapa de prueba 3 en el filtro de datos local.
(la ubicación y de la línea de referencia está predefinida)

Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?@SDF1

Esto agrega líneas de referencia a todas las subtramas, lo cual no es lo que quiero.
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?Este es el caso sencillo en el que, debido al grupo Y, los gráficos se dividen en diferentes FrameBoxes. Luego puede agregar líneas de referencia individuales a través de Personalizar.

Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox( 3 ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Pen Size( 3 );
Y Function( 0.4, x );
)}
)
)
)Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?Hola @neo ,
yo haría lo mismo @hogi sugerido y use la opción Personalizar cuando haga clic derecho en el gráfico de interés, haga clic en "+" para agregar un nuevo script a GB, luego escriba el JSL para agregar una línea.



Ahora, creo que sería más desafiante hacer que esto responda dinámicamente al filtro de datos local. Si necesita ese tipo de funcionalidad, en su lugar generaría mi propia ventana de informe que tiene un generador de gráficos integrado y luego tal vez usaría casillas de verificación para brindarle al usuario opciones para actualizar las subtramas con líneas de referencia cuando seleccione las diferentes casillas de verificación de TestStage.
También descubrí una manera de cambiar el color de la línea anidada. No sé si esta es la forma "correcta" de hacerlo, o incluso si es la forma más rápida, pero si hace clic derecho en el eje anidado y luego selecciona mostrar propiedades, si hace clic en el eje anidado y luego hace clic Haga clic en el botón rojo al lado de AxisBox, seleccione Copiar configuración del eje, luego puede pegarlo en una ventana de secuencias de comandos y editarlo. Seleccione el eje de interés y cambie el color de la línea de "Ninguno" al color que desee. Luego debe copiar este código editado, volver al botón rojo, seleccionar Pegar configuración del eje y se actualizará el gráfico. Esto hará el trabajo, pero no estoy seguro de cómo se puede hacer dinámicamente.



Al guardar el script correspondiente en una ventana de scripting, podrá ver los comandos que necesita para enviar Graph Builder y Label Row para obtener el resultado que desea.
Graph Builder(
Size( 592, 526 ),
Y Group Edge( "Left" ),
Graph Spacing( 4 ),
Variables(
X( :TestStage ),
X( :TestParameter, Position( 1 ) ),
Y( :Median ),
Group Y( :TestStage )
),
Elements(
Points( X( 1 ), X( 2 ), Y, Legend( 33 ) ),
Smoother( X( 1 ), X( 2 ), Y, Legend( 34 ) )
),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == {1, 2, 3} ) )
),
SendToReport(
Dispatch(
{},
"TestStage",
ScaleBox,
{Label Row( 2, Line Color( "Purple" ) )}
),
Dispatch(
{},
"Graph Builder",
FrameBox( 3 ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Pen Size( 3 );
Y Function( 0.3, x );
)}
)
)
);Usando esta información y volviendo a su publicación original usando el archivo Semiconductor Capability.jmp, puede lograr lo que estaba pidiendo originalmente, el eje anidado es violeta, las líneas verticales de la cuadrícula son violetas y hay una línea de referencia solo para el gráfico más inferior. En este caso particular, hacer doble clic en el eje al que desea agregar la línea de referencia funcionará porque está trazando diferentes columnas en las subtramas del generador de gráficos. Para la tabla de datos de ejemplo que compartió, debe hacerlo al revés con Personalizar y agregar una Función Y().

Aquí está el código JSL que generó el gráfico anterior. Puede ver dónde necesita realizar las ediciones apropiadas para su caso específico.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt<<GRAPH builder=""></GRAPH>
¡Espero que esto ayude!,
DS
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?podrías calcular la media a partir de los valores mismos:
Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) )
);
myFB = Current Report()[FrameBox( 3 )];
myFB << Add Graphics Script(
2,
Description( "" ),
<STRONG> mySeg = myFB << Find Seg( Marker Seg( 1 ) );
value = Mean( mySeg << Get Y Values );</STRONG>
Pen Color( "red" );
Pen Size( 3 );
Y Function( value, x );
);
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?@SDF1 Gracias. Veré cómo lograste cambiar el color del eje anidado a violeta. Mientras tanto usé @hogi sugerencia y Crear controlador de cambio de filtro () para cambiar dinámicamente el lugar donde JMP coloca la línea de referencia a medida que el usuario cambia las selecciones de filtro. Todavía no he resuelto dos problemas con esto.
1. El controlador de cambio de filtro no se activa cuando el gráfico se traza por primera vez, sino solo cuando se selecciona el siguiente TestStage.
2. Cuando se cambia el filtro, la línea de referencia anterior permanece en una etapa de prueba diferente, lo cual entiendo por qué, pero no he podido eliminarla todavía.
Names Default To Here (1);
clear log ();
gb = Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == {1} ) )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
getTestStage = Function( {this}, //print (this);
testStateFiltered = Associative Array(:TestStage [ldf << get filtered rows]) << get keys;
gb << SendToReport(
Dispatch({},"Graph Builder",
FrameBox(N Items (testStateFiltered)), {Add Graphics Script( 2, Description( "" ), Pen Color( "red" ); Line Style ("dashed"); Pen Size( 0.25 );
Y Function( 0.2, x );
)}
)
);
show (N Items (testStateFiltered)); Print(testStateFiltered);
);
rs = ldf << Make Filter Change Handler( getTestStage() ); Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?Por cierto, hay una nueva característica en Jmp17:
agregar líneas de referencia dinámicas basadas en valores estadísticos
Graph Builder(
Y Group Edge( "Left" ),
Summary Statistic( "Median" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements(
Points( X, Y, Legend( 33 ) ),
Smoother( X, Y, Legend( 34 ) ),
Caption Box(
X,
Y,
<STRONG> Summary Statistic( "Median" ),
Location( "Axis Reference Line" )</STRONG>
)
),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == 1 ) )
)
)
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?Hola @neo ,
Esa es una idea genial que @hogi tiene con respecto al uso de un controlador de cambio de filtro. No había pensado en eso. Modifiqué el código anterior para solucionar los dos problemas que tenía. El script ahora creará el primer gráfico con la línea de referencia y luego actualizará cada gráfico en consecuencia, incluso al elegir más de un filtro de datos. ¿Esto resuelve el problema?
Names Default To Here( 1 );
dt = Current Data Table();
//this creates a string list of the column names
ColNamesList = dt << Get Column Names( "string" );
//This tests if the there exist a :Mean Column. If not, it runs a summary to generate this data, updates the main table with the means and then deletes a column and closes out the summary table.
If( Contains( ColNamesList, "Mean" ) == 0,
dtMeans = dt << Summary(
Group( :TestParameter ),
Mean( :Median ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "stat" ),
Link to original data table( 0 ),
output table name( "MeanStats" )
);
dt << Update( With( dtMeans ), Match Columns( :TestParameter = :TestParameter ) );
dt << Delete Columns( :N Rows );
Close( dtMeans, NoSave );
);
//this makes the original graph with the reference line of the first row in column :Mean
gb = dt << Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
Dispatch(
{},
"Graph Builder",
FrameBox( N Items( testStateFiltered ) ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Line Style( "dashed" );
Pen Size( 0.25 );
Y Function( Eval( :Mean[1] ), x );
)}
),
Local Data Filter( Conditional, Add Filter( columns( :TestStage ), Where( :TestStage == 1 ) ) )//no {} around the 1 here.
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
getTestStage = Function( {this}, //print (this);
testStateFiltered = Associative Array( :TestStage[ldf << get filtered rows] ) << get keys;
//this finds which row to grab the mean from
mrows = dt << Get Rows where( :TestStage == testStateFiltered[1] );
//this defines the mean to Eval() in the Y Function()
gbmean = :Mean[mrows[1]];
If( N Items( testStateFiltered ) == 1, //only does this if only one data filter is selected
gbreport = gb << Report; //makes a report reference for the graph builder
fb = gbreport[GraphBuilderComponentBox( 17 )];//accesses the frame to remove the script from
fb << Remove Graphics Script( 1 );//removes most recent script from the frame
);
gb << SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox( N Items( testStateFiltered ) ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Line Style( "dashed" );
Pen Size( 0.25 );
Y Function( Eval( GBMean ), x );
)}
)
);
Show( N Items( testStateFiltered ) );
Print( testStateFiltered );
);
rs = ldf << Make Filter Change Handler( getTestStage() );
¡Espero que esto ayude!,
DS
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?la primera vez, puedes correr obtenerEtapa de prueba(1) a mano.
Tenga en cuenta que con el filtro de datos hay de 1 a 3 cuadros de marco en GraphBuilder (la mayoría de las veces, ¿solo 1?). Entonces, determina a qué FB enviar el mensaje, o simplemente selecciona un TestStage y envía siempre el comando a Framebox 1.
Re: ¿Cómo (1) cambiar el color predeterminado en AxisBox y (2) agregar una línea de referencia en una sola variable del eje Y en gráficos Y agrupados?@SDF1 @hogi
La tabla de datos que compartí se armó rápidamente como ejemplo. Debería haber mencionado que no puedo usar LSL/USL ni ningún otro número en esta tabla para generar la línea de referencia.
De todos modos, lo siguiente me ha funcionado.
- Vocación getTestStage(1) antes de la llamada a Make Filter Change Handler.
- Agregar RemoveGraphicsScript (N) con identificadores apropiados dentro de la función getTestStage donde N es el número de FrameBox obtenido del último número de Framebox de TestStage seleccionado generado cuando se cambia el filtro TestStage.
Me conformaré con esto ahora. Sin embargo, queda una cuestión pendiente. Si selecciono un TestStage, luego un segundo y luego un tercero, todo funciona como se esperaba, pero si vuelvo de 3 selecciones a una, mi secuencia de comandos no funciona como se esperaba.
Cuando tenga la oportunidad, publicaré un conjunto de datos representativo con el guión que explica el problema.