Forzar leyenda con marcador y color del estado de la filaHola,
Estoy intentando hacer una leyenda con marcadores y colores, pero me gustaría elegirlos. Pensé que sería fácil gracias al estado de la fila (estado de color, estado del marcador, estados combinados). Pero una vez que se asignan el color y el marcador a cada fila, no puedo encontrar una manera de forzarlos en la leyenda.
Me gustaría hacerlo por script (estaba pensando en agregar un cuadro con la leyenda), pero no encuentro la manera de manejar los "marcadores" que he creado.
Gracias
Re: Forzar leyenda con marcador y color de estado de filaGracias Ian,
se acerca más a mi idea inicial y es fácil de integrar en mi guión.
Así que prefiero ligeramente esta solución, aunque la otra funciona bien.
Re: Forzar leyenda con marcador y color de estado de filaNo he descubierto cómo hacerlo con un script, pero si vas a Filas>Color o Marcar por columna
obtienes lo siguiente

Ahora puede hacer clic derecho en la leyenda y cambiarla a lo que desee, y si ha seleccionado "Crear ventana con leyenda", se creará una leyenda para usted. Esto tiene el beneficio adicional de seleccionar en la tabla todo lo que haya seleccionado en la leyenda.
Puedes hacer lo mismo dentro de las secuencias de comandos con:
Names Default to here(1);
dt = Open("$SAMPLE_DATA\Big CLass.jmp");
legend = dt << Marker By Column(:age);
new window("Not Really",
Hlistbox(
bivariate(Y(:height), X(:weight)),
legend
)
)
Pero pierdes (al menos yo no he encontrado una manera de hacerlo) la personalización que buscas.
Re: Forzar leyenda con marcador y color de estado de filaComo alternativa, podría considerar utilizar 'MarkerSeg'. En el código siguiente, 'dt' hay una tabla de todos los distintos niveles de la columna que desea colorear y marcar. Podrías usar 'Tablas > Resumen' y hacerlo invisible.
NamesDefaultToHere(1);
// Example data table (markers and colors assigned by 'Lot ID')
dt = New Table( "Rows With Colors and Markers",
Add Rows( 12 ),
New Column( "Lot ID",
Character,
"Nominal",
Set Values(
{"lot1", "lot10", "lot11", "lot12", "lot13", "lot2", "lot3", "lot4",
"lot5", "lot6", "lot7", "lot8"}
),
Lock( 1 )
),
Set Row States(
[896.813481688499, 1104.17848521471, 34064.2516910434, 1584.79095828533,
1856.1745531559, 34848.5869575739, 35120.7292968035, 2704.17450988293,
2976.75480300188, 3200.51829791069, 3408.21706777811, 36368.77437675]
)
);
// Make legend window with MarkerSeg
n = NRow(dt);
xx = J(n, 1, 1);
yy = Transpose(1::n);
legendList = Column(dt, "Lot ID") << getValues;
gb = Graph Box(
FrameSize( 150, 300*(n/16) ),
Y Scale( 0, n+1 ),
X Scale( 0, 6 ),
Y Name(" "),
X Name(" "),
Y Axis(ShowLabels(0), ShowMajorTicks(0), ShowMinorTicks(0)),
X Axis(ShowLabels(0), ShowMajorTicks(0), ShowMinorTicks(0)),
Marker Seg( xx, yy, Row States( dt ) ),
For( i = 1, i<=n, i++, Text( {1.5, i-0.1}, legendList[i] ) )
);
db = PanelBox("Row State Colours and Markers for 'Lot ID'", gb);
New Window( "My Legend", db);
Re: Forzar leyenda con marcador y color de estado de filaParece ser una buena solución. Ahora necesito adaptarlo a mi caso. ¡Muchas gracias!
¡Simplemente decepcionado por el estado de la fila!
Re: Forzar leyenda con marcador y color de estado de filaSi miras
Ayuda==>Índice de secuencias de comandos
y observe los elementos Graph Builder y Legend Box(), la manipulación de la leyenda después de que se haya ejecutado Graph Builder es limitada. Sin embargo, puedes utilizar una técnica que funcione para cualquier cosa, pero que sea un poco engorrosa. Si genera una cadena literal que contiene el código que necesita para que Graph Builder haga lo que desea, luego puede ejecutar esa cadena literal. Aquí tienes un ejemplo muy primitivo, pero creo que verás qué tipo de cosas puedes hacer con él.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" );
Summarize( dt, groups = by( dt:sex ) );
numofgroups = N Items( groups );
TheCode =
"Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
\!"400\!",
ScaleBox,
{Legend Model(
1,";
For( i = 0, i <= numofgroups - 1, i++,
Show( i );
TheCode = TheCode || "Properties(" || Char( i ) || ", {Line Color (" || Char( i + 3 ) || "),Marker( " || Char( 16 - i ) || ")}),";
);
TheCode = TheCode || "Dispatch( {}, \!"400\!", LegendBox, {Legend Position( {1, [2, 3], 1, [0, 1]} ), Position( {2, 3, 0, 1} )} ))';";
Eval( Parse( TheCode ) );Re: Forzar leyenda con marcador y color de estado de filagracias jim
1. Estoy de acuerdo en que no es un problema real... ¡Puedo conseguir la lista con un poco de trabajo!
2. Quizás no fui lo suficientemente claro. Como mencionas, puedo obtener fácilmente el número (N) del elemento que necesito modificar en la leyenda. Significa que tendré que crear N líneas en el script que crea el generador de gráficos (necesito enviar N líneas con "cuadro de leyenda (propiedades (0...N)"). Pero si construyo un gráfico con N+1 líneas en el cuadro de leyenda, funcionará parcialmente (la línea N+1 no se modificará). Por lo tanto, necesito hacer un bucle dentro del script que crea el constructor de gráficos (¿es factible?) o después del script que crea el constructor de gráficos (tiene más sentido, pero no puedo encontrar mensajes que pueda enviar a legendbox) .
Re: Forzar leyenda con marcador y color de estado de fila1. Los marcadores están numerados como se puede ver en el cuadro a continuación. Esto fue generado por un script, como se demuestra en la guía de scripting.
Ayuda==>Libros==>Guía de secuencias de comandos

Algunos de los marcadores tienen nombres asignados, que ha visto en el script Graph Builder. No conozco ninguna lista con esos nombres, pero siempre puedes ejecutar interactivamente un Graph Builder y asignar el marcador que deseas, y luego ver el script que produjo y ver si te da un nombre y no solo un número.
2. La leyenda aparecerá en orden alfabético o numérico, a menos que esté activado el orden de valores o el nivel de orden de filas. Programáticamente, puede determinar eso y luego ajustar su código. En cuanto a averiguar las edades en la tabla de datos, la función Summarize() es la que uso la mayor parte del tiempo.
resumir(dt,porgrupo = Por(:Edad));
La variable "por grupo" tendrá una lista de todas las diferentes edades encontradas.
N artículos (por grupo);
Te da el número de edades diferentes encontradas.
Re: Forzar leyenda con marcador y color de estado de filaGracias por la rápida respuesta,
1/ Puede funcionar siempre que tenga un conjunto completo de nombres de marcadores (encontré en la documentación los colores estándar JMP). ¿Sabes dónde puedo encontrar algo equivalente para los nombres de los marcadores?
2/ En ese caso, si los colores y marcadores están escritos en una tabla dedicada, puedo modificar cada línea de la leyenda mediante (eval(substitute(expr(graphbuilder(color1,marker1),expr(color1),mycolor, expr( marcador1), mi marcador))). Funciona, buen paso adelante, pero necesito saber el número de elemento en la leyenda para poder realizar la sustitución.
Para que quede más claro para el archivo de "clase grande", si la superposición se realiza con :AGE y no conozco las EDAD(es) en el archivo, ¿cómo puedo hacerlo?
Tal vez podría hacerlo en un bucle (después del generador de gráficos), si pudiera enviar un mensaje al cuadro de leyenda. Pero no puedo encontrar en la documentación mensajes que modifiquen el elemento... Y finalmente el nodo del árbol está "vacío" en el nodo legendbox.
Re: Forzar leyenda con marcador y color de estado de filaLa forma más sencilla que encontré para que JMP maneje esto es modificar la leyenda y, por lo tanto, el gráfico usando JSL, para que coincida con los estados de las filas. Aquí hay un script que muestra cómo modificar la leyenda en Graph Builder.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" );
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1,
Properties( 0, {Marker( "FilledTall" )} ),
Properties( 1, {Line Color( 1 ), Line Style( "Dashed" ), Marker( "Filled Diamond" )} )
), Legend Model(
1,
Properties( 0, {Marker( "FilledTall" )} ),
Properties( 1, {Line Color( 1 ), Line Style( "Dashed" ), Marker( "Filled Diamond" )} )
)}
),
Dispatch( {}, "400", LegendBox, {Legend Position( {1, [2, 3], 1, [0, 1]} ), Position( {2, 3, 0, 1} )} )
)
);
Produce lo siguiente
