JMP 17.2.0
EDITAR: Archivo de datos de ejemplo cargado con la publicación principal.
He tenido un pequeño problema al intentar personalizar mis gráficos, ya sea con el constructor de gráficos o con JSL (o una combinación de ambos). He buscado en los foros de JMP y he encontrado temas similares, pero ninguna solución que funcione para lo que quiero hacer específicamente.
Lo que quiero que haga JMP es: codificar por colores mis marcadores por número de prueba (o en el código es RUN_NUM), elegir diferentes formas de marcador por número de prueba y luego trazar una línea de ajuste cuadrática para cada número de prueba donde el color de la línea coincida con el color de los marcadores para cada número de prueba y la línea de ajuste también sea siempre una línea discontinua para cada número de prueba. La otra cosa a tener en cuenta aquí es que no quiero asignar colores de forma permanente a pruebas específicas utilizando una función como los estados de color de fila. Quiero que el gráfico use el mismo esquema de colores sin importar qué números de prueba trace, ya que estos datos forman parte de una tabla de datos en crecimiento que puede terminar con 100-200 pruebas. Por ejemplo, si trace las Pruebas 1-5, quiero que siempre se tracen como un esquema de colores como azul, rojo, verde, naranja, morado para que si cambio lo que trace, digamos ahora Pruebas 1-4 + Prueba 7, el esquema de colores sea el mismo para las cinco pruebas trazadas.
Casi puedo obtener todas las funciones mencionadas, pero no consigo que la codificación de colores de los marcadores y la línea de ajuste coincidan. Este es mi proceso hasta ahora en Graph Builder/JSL:
- Trazo mis puntos de datos en GB, normalmente cuatro puntos de datos por prueba.
- Arrastro 'número de prueba' al espacio de 'superposición' en GB. Este código de colores mis puntos de datos por prueba.
- Arrastro el "número de prueba" al espacio "color" en GB. Esto elige una forma para cada prueba.
- Hago clic en la opción de línea de ajuste que agrega la línea al gráfico, pero tienen diferentes estilos de línea y el color siempre es el azul predeterminado de JMP.
Siguiendo los pasos anteriores, estoy cerca, pero no del todo. En los foros de JMP, he encontrado una buena manera de añadir JSL para modificar el estilo de línea o el color, pero no ambos a la vez. Puedo guardar mi gráfico de GB y luego editar un poco el JSL para obtener uno u otro.
Nota: En el código siguiente, el número de prueba = RUN_NUM
Añadiendo esto en la parte superior de mi código gráfico:
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
Y agregando esto al final de mi código gráfico:
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
})));
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
})));
Puedo usar el código anterior para modificar la línea de propiedades de ajuste. Sin embargo, he encontrado algunas peculiaridades.
- Tal como está, el código anterior modifica el estilo de línea a discontinuo para cada línea de ajuste.
- Tal como está, el código anterior modifica el ancho de línea para cada línea de ajuste.
- Tal como están las cosas, todas las líneas de ajuste están coloreadas en negro por alguna razón.
Es casi todo lo que quiero, excepto que las líneas son negras. Siguiente peculiaridad:
- Si elimino el "número de prueba" de la propiedad "color" en GB, todas mis líneas de ajuste ahora coinciden con el color del marcador y cambian dinámicamente con cada prueba seleccionada. Además, todas tienen trazos y el ancho correcto.
- Ahora mis marcadores son todos círculos en lugar de formas únicas que cambian al seleccionar diferentes pruebas e ignoran el tamaño de marcador especificado en el código.
Así que ya lo tengo todo menos la forma del marcador. Aquí es donde estoy atascado. Parece que debo conformarme con uno de dos resultados:
- Todo lo que quiero excepto la línea de ajuste son siempre líneas negras
- Todo lo que quiero, excepto las formas de los marcadores, siempre son círculos (y pequeños).

¿Alguien sabe cómo lograr todo lo que quiero para un gráfico personalizado? ¿Quizás estoy malinterpretando algo? Agradezco cualquier ayuda.
Algunas discusiones anteriores relevantes del JMP:
- https://community.jmp.com/t5/Discussions/Match-Line-Color-of-Normal-Quantile-Plot-to-Row-Color-Set-in-Row/mp/124080
- https://community.jmp.com/t5/Discussions/Change-color-theme-in-plot-legend-of-FIt-Curve/td-p/368792
- https://community.jmp.com/t5/Discussions/assign-marker-style-line-style-by-quot-string-quot-or-specific/td-p/48860
Código GB completo:
dt = Data Table( "DT" );
//this short section makes a list of all runs/tests in the data table
//then all the runs are counted in a later section for a "for loop"
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
//below is the graph builder code
gb = Graph Builder(
Size( 850, 600 ),
Show Legend( 1 ),
Show Title( 0 ),
Show Footer( 0 ),
Fit to Window( "Off" ),
Variables(
X( :TEMP ),
Y( :CONVERSION ),
Overlay( :RUN_NUM ),
Color( :RUN_NUM )
),
Elements(
Points( X, Y, Legend( 1 ) ),
Line Of Fit(
X,
Y,
Legend( 2 ),
Degree( "Quadratic" ),
Confidence of Fit( 0 )
)
),
SendToReport(
Dispatch( {"Line Of Fit"}, "", OutlineBox, {Close( 0 )} ),
Dispatch(
{},
"TEMP",
ScaleBox,
{Min( 50 ), Max( 100 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Show Major Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )
}
)}
),
Dispatch(
{},
"CONVERSION",
ScaleBox,
{Min( 40 ), Max( 60 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Automatic Font Size( 0 ), Show Major Grid( 1 ),
Show Minor Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )}
)}
),
Dispatch(
{},
"X title",
TextEditBox,
{Set Text( "Temperature" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
Dispatch(
{},
"Y title",
TextEditBox,
{Set Text( "Conversion" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
)
);
//this loop goes through all runs and changes lines to dashed and changes their width
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
}
)
)
);
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
}
)
)
);
¡Gracias por la respuesta! Debido a mi limitado conocimiento de los estados de fila, no creo que quiera usarlos del todo. Los estados de fila funcionan bien para este conjunto de datos tan pequeño, pero mis conjuntos de datos actuales implican más de cien pruebas. Si uso los estados de fila para asignar colores, estos se repetirán con un tono ligeramente diferente, por lo que tendré pruebas con Tono Rojo n.° 1, Tono Rojo n.° 2, Tono Rojo n.° 3, etc. Luego, si necesito un gráfico de esas pruebas específicas, todas tendrán rojos ligeramente diferentes y será muy difícil distinguirlas según el color. Preferiría que el esquema de colores esté vinculado al gráfico, de modo que, independientemente del subconjunto de pruebas que trace, el esquema de colores sea siempre el mismo; es decir, las mismas pruebas que serían Tono Rojo n.° 1, Tono Rojo n.° 2, Tono Rojo n.° 3, etc., con estados de fila, serían Azul, Rojo, Verde, etc., con el esquema de colores vinculado al gráfico. Solo mencioné el color arriba, pero creo que sería el mismo escenario para las formas de los marcadores también, es decir, las formas de los marcadores del estado de fila pueden eventualmente repetirse en grandes conjuntos de datos, por lo que habría un subconjunto de pruebas que tendrían todas las mismas formas de marcador.
Para el color, tiene más opciones y es más fácil de administrar que los marcadores. Actualmente, solo puede tener una columna para Superposición, por lo que probablemente tendrá que usar el controlador de cambios de filtro para que todos los estilos funcionen correctamente. Por defecto, obtendrá un gráfico como este.

Luego, podrías usar el controlador de cambio de filtro para mantener el tamaño de los marcadores más alto y el estilo de línea como líneas. Con algo como esto, JMP se equivocará de vez en cuando y olvidará que debería estar agregando color.
</CODE></PRE>
<P>Creo que también podrías intentar lidiar con la pesadilla llamada Leyenda, pero... yo la evitaría si es posible. Es una de las peores (o posiblemente la peor) cosas que puedes intentar manipular en Graph Builder.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-849266" slang="en-US" mode="CREATE">Re: Forzar a JMP a hacer coincidir el color de la línea de ajuste con el color del marcador junto con un estilo de línea forzado</LINGO-SUB><LINGO-BODY id="lingo-body-849266" slang="en-US" mode="CREATE"><P>El tamaño del marcador se puede controlar desde el menú de clic derecho y es un control para el cuadro de marco.</P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/74118i18BC8FCF0D2275C2/jthi_0-1742669047885.png" role="button" title="jthi_0-1742669047885.png" alt="jthi_0-1742669047885.png" /></span></SPAN></SPAN></SPAN></SPAN></P>
<P>No pude encontrar nada similar para las líneas... así que tal vez algo como esto podría funcionar.</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(Points(X, Y, Legend(5)), Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))),
Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7)))),
SendToReport(Dispatch({}, "Graph Builder", FrameBox, {Marker Size(6), Marker Drawing Mode("Normal")}))
);
l_expr = Expr(Legend Model(7));
Summarize(dt, c = By(:RUN_NUM));
For Each({item}, c,
cur_expr = EvalExpr(Properties(0, {Line Style("Dashed")}, Item ID(Expr(item), 1)));
Insert Into(l_expr, Name Expr(cur_expr));
);
d_expr = EvalExpr(
Dispatch({}, "400", ScaleBox,
{Expr(Name Expr(l_expr))}
)
);
Eval(EvalExpr(Send(gb, Expr(Name Expr(d_expr)))));Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(
Points(X, Y, Legend(5)),
Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))
)
);
ldf = gb << Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7))));
Eval(EvalExpr(
f = Function({a},
gb_rep = Expr(Report(gb));
gb << inval;
fb = gb_rep[FrameBox(1)];
segs = fb << Find Segs;
For Each({seg}, segs,
Match(seg << class name,
"MarkerSeg", seg << Set Marker Size(10),
"LineSeg", seg << Set Line Style("Dashed")
);
);
);
));
rs = ldf << Make Filter Change Handler(f);
f(1); // to initialize at least once