Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasHola, comunidad de JMP,
Me gustaría añadir un borde a cada barra de un gráfico de barras y personalizar su ancho. ¿Cómo puedo hacerlo en JMP?
Como se muestra en la imagen a continuación, me gustaría agregar un borde o contorno alrededor de cada barra.

He oído hablar de una solución alternativa que consiste en superponer dos gráficos de barras para simular un contorno. Sin embargo, este método no parece permitir personalizar el ancho del contorno.
¿Existe alguna forma, ya sea a través de la interfaz del Generador de gráficos o editando un script, de aplicar un contorno a cada barra y cambiar independientemente su color y anchura?
Actualmente estoy utilizando JMP Student Edition 19.
¡ Gracias de antemano por su ayuda!
Análisis y modelado de datos básicosExploración y visualización de datosRe: Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasCreo que usar un segundo gráfico de barras sería una buena solución, pero requerirá algo de trabajo, ya que habría que crear una columna adicional para ajustar las alturas y luego modificar la proporción del ancho. Esto ya se ha hecho con ese método.

Aquí tienes un ejemplo de script que puedes ejecutar y luego explorar cómo se ha construido el gráfico (se ha cambiado el orden de las barras, se ha modificado la proporción del ancho, se ha cambiado el color, etc.).
Ver más...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt << New Column("Mean[height][age]",
Numeric,
"Continuous",
Formula(Col Mean(:height, :age) + 1)
);
gb = dt << Graph Builder(
Size(656, 549),
Show Control Panel(0),
Variables(
X(:age),
Y(:height),
Y(:"Mean[height][age]"n, Position(1)),
Overlay(:age)
),
Elements(
Bar(X, Y(1), Legend(6), Bar Style("Stacked")),
Bar(X, Y(2), Legend(7), Bar Style("Stacked"))
),
SendToReport(
Dispatch({}, "400", ScaleBox,
{Legend Model(
7,
Base(0, 0, 0, Item ID("12", 1)),
Base(1, 0, 1, Item ID("13", 1)),
Base(2, 0, 2, Item ID("14", 1)),
Base(3, 0, 3, Item ID("15", 1)),
Base(4, 0, 4, Item ID("16", 1)),
Base(5, 0, 5, Item ID("17", 1)),
Type Properties(0, "Bar", {Fill Color(0)}),
Properties(0, {Fill Color(0)}, Item ID("12", 1)),
Properties(1, {Fill Color(0)}, Item ID("13", 1)),
Properties(2, {Fill Color(0)}, Item ID("14", 1)),
Properties(3, {Fill Color(0)}, Item ID("15", 1)),
Properties(4, {Fill Color(0)}, Item ID("16", 1)),
Properties(5, {Fill Color(0)}, Item ID("17", 1))
)}
),
Dispatch({}, "Graph Builder", FrameBox,
{Reorder Segs({1, 2, 4}), DispatchSeg(
BarSeg(1),
{Set Width Proportion(0.7)}
)}
),
Dispatch({}, "400", LegendBox,
{Legend Position({6, [0, 1, 2, 3, 4, 5], 7, [-1, -1, -1, -1, -1, -1]})}
)
)
);
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barras@jthi tiene una buena solución. Suelo usar las primitivas gráficas de JMP que permiten dibujar directamente líneas y rectángulos, con la posibilidad de colorearlos y definir su grosor.
Consulte la sección "Agregar script gráfico" en el Índice de scripts y la Guía de scripts para obtener documentación y ejemplos sobre cómo hacerlo.
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasOtras (buenas) opciones serían:
- Usando GraphicScript. Necesitas saber cuántas barras tienes, y creo que no puedes obtener esa información del objeto BarSeg. Por lo tanto, es más fácil hacerlo añadiendo un marcador auxiliar al gráfico (que se puede ocultar en el gráfico final).
- Utilice la expresión de dibujo de marcador. Requiere añadir un marcador y es más difícil de implementar, pero probablemente sea la opción más robusta.
No tengo tiempo para detallar estas opciones ahora, pero existen.
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasTuve tiempo para crear el guion gráfico.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(656, 549),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(
Bar(X, Y, Legend(4)),
Points(X, Y, Legend(5), Summary Statistic("Mean"))
),
SendToReport(
Dispatch({}, "400", ScaleBox,
{Legend Model(
5,
Type Properties(0, "Marker", {Transparency(0)}),
Properties(0, {Transparency(0)}, Item ID("Mean", 1))
)}
)
)
);
fb = Report(gb)[FrameBox(1)];
fb << Add Graphics Script(Function({this}, // can be laggy as it is a graphic script with a loop
ms = this << Find Seg(MarkerSeg(1));
xs = ms << Get X Values;
ys = ms << Get Y Values;
sideshift = 0.27;
For(i = 1, i <= N Items(xs), i++,
Pen Size(10); // Width of the line
Pen Color("Black");
Rect(xs[i] - sideshift, ys[i], xs[i] + sideshift, -1, 0);
);
));

Y aquí está Marker Draw Expr
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(656, 549),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(
Bar(X, Y, Legend(4)),
Points(X, Y, Legend(5), Summary Statistic("Mean"))
),
SendToReport(
Dispatch({}, "400", ScaleBox,
{Legend Model(
5,
Type Properties(0, "Marker", {Transparency(0)}),
Properties(0, Item ID("Mean", 1))
)}
)
)
);
fb = Report(gb)[FrameBox(1)];
seg = (fb << FindSeg(Marker Seg(1)));
seg << Set Marker Draw Expr(
Function({this seg, this row, x, y, size, row state},
Pen Size(10); // Width of the line
Pen Color("Black");
Rect(x - 0.27, y, x + 0.27, -1, 0);
)
);

Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barras@jthi ,
El ejemplo Marker Draw Expr no funciona correctamente en mi instalación de JMP 19. La transparencia del marcador parece estar configurada en 0 por defecto. El siguiente cambio permite que el rectángulo se muestre correctamente.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(656, 549),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(
Bar(X, Y, Legend(4)),
Points(X, Y, Legend(5), Summary Statistic("Mean"))
),
SendToReport(
Dispatch({}, "400", ScaleBox,
{Legend Model(
5,
Type Properties(0, "Marker", {Transparency(0)}),
Properties(0, Item ID("Mean", 1))
)}
)
)
);
fb = Report(gb)[FrameBox(1)];
seg = (fb << FindSeg(Marker Seg(1)));
seg << Set Marker Draw Expr(
Function({this seg, this row, x, y, size, row state},
show(x,y);
Pen Size(10); // Width of the line
Pen Color("Black");
transparency(1); // Needed for JMP 19
Rect(x - 0.27, y, x + 0.27, -1, 0);
)
);
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasSi te parece bien una línea fina como borde, es muy fácil: solo tienes que añadir un segundo gráfico de barras con patrón = "ninguno" y ajustar el color, por ejemplo, a negro.

Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Graph Builder(
Size( 469, 365 ),
Summary Statistic( "Median" ),
Variables( X( :age ), Y( :height ), Overlay( :sex ), Color( :sex ) ),
Elements(
Bar( X, Y, Bar Style( "Stacked" ) ),
Bar( X, Y, Legend( 2 ), Bar Style( "Stacked" ) )
),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model(
2,
Properties(
0,
{Fill Color( 0 ), Fill Pattern( "none" )},
Item ID( "F", 1 )
),
Properties(
1,
{Fill Color( 0 ), Fill Pattern( "none" )},
Item ID( "M", 1 )
)
)}
)
)
);
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barras@txnelson
Muchas gracias por sus respuestas detalladas. Me han sido de gran ayuda. Pero hay una cosa más que me gustaría hacer.
Cuando uso Set Marker Draw Expr para dibujar un borde de barra, este se dibuja en la capa superior.
En consecuencia, cuando agrego barras de error o puntos de datos individuales (mediante un gráfico de puntos), el borde personalizado se dibuja sobre ellos.
¿Existe alguna forma de controlar el orden de dibujo (capa) del borde para que aparezca detrás de los puntos de datos?
Para la creación de gráficos altamente personalizados, ¿se suelen utilizar lenguajes de programación como R o software especializado como GraphPad Prism?
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasPuedes ajustar el orden de cada elemento:
Haz clic con el botón derecho en el gráfico y cambia el orden:

Si solo hay un tipo de parcela, simplemente agregue 20 y personalícelas.
Graph Builder es mucho más flexible y potente de lo que la gente podría pensar a primera vista. Este es el truco:
Una transición fluida desde la sencilla función de arrastrar y soltar hasta gráficos altamente personalizados.
Con Establecer marcador Dibujar Expr ya te has metido en un buen lío con una función muy elaborada, pero hay muchas más.
No es necesario utilizar otra herramienta de trazado.
Re: Cómo agregar/personalizar un borde (contorno) a los gráficos de barrasDibuja tu gráfico con los nuevos bordes y las barras de error. Luego, haz clic derecho en el gráfico y selecciona "Personalizado". Se abrirá un cuadro de diálogo donde podrás seleccionar las barras de error y moverlas al frente. Cierra el cuadro de diálogo y luego ve al triángulo rojo y selecciona "Guardar script". Podrás examinar el script generado y verás lo necesario para mover las barras de error al frente usando JSL.