¿Cómo hago gráficos de barras de inicio y fin?Supongamos que tengo estos datos:
| Paso | Comenzar | Detener |
| mezclador | 0 | 2 |
| calentador1 | 1 | 12.3 |
| inyector1 | 4 | 4.5 |
| mezclador | 6 | 8 |
| calentador2 | 10.3 | 13 |
| inyector1 | 12 | 12.5 |
| calentador1 | 16 | 25.4 |
| mezclador | 18 | 20 |
| calentador2 | 23.4 | 30 |
| mezclador | 24 | 26 |
| admirador | 24 | 45 |
| mezclador | 30 | 40 |
...y quiero hacer esta gráfica (solo las barras):

¿Es posible con GraphBuilder? (Esta imagen es una maqueta con PowerPoint)
Exploración y visualización de datosRe: ¿Cómo hago gráficos de barras de inicio y fin?Hola @BHarris ,
No puedo reproducir directamente lo que presentas en PowerPoint, pero quizás tenga algo bastante similar a lo que pretendes tener:

A diferencia de su imagen, los diferentes rangos no están completamente alineados, ya que necesito tener un identificador único para cada rango de valores.
Creo que las barras podrían agrandarse para facilitar la lectura.
Puedes echarle un vistazo al script en la tabla de datos adjunta.
EDITAR: Al usar una columna de ID con menos niveles, el gráfico de barras se ve mejor:

Ambos scripts gráficos se guardan en la tabla de datos adjunta.
Re: ¿Cómo hago gráficos de barras de inicio y fin?Buen enfoque : )
Como alternativa a Cubrir , también se podría utilizar el ID anidado en el eje Y:

Re: ¿Cómo hago gráficos de barras de inicio y fin?Ambas opciones generan mucho espacio en blanco, ya que cada activación/desactivación tiene su propia fila horizontal, y en mi caso práctico puede haber muchas activaciones/desactivaciones. Los gráficos de barras tienen una configuración de "superposición" de triángulos rojos que parece funcionar, pero incluso en "Completo" no parece tener ningún efecto, así que esperaba que hubiera una opción oculta o un enfoque JSL que mantuviera las barras alineadas verticalmente.
Re: ¿Cómo hago gráficos de barras de inicio y fin?Aquí está mi enfoque para crear el gráfico.

Names Default To Here( 1 );
dt = Current Data Table();
gb = Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( X( :Start ), X( :Stop, Position( 1 ) ), Y( :Step ), Color( :Step ) ),
Elements( Points( X( 1 ), X( 2 ), Y, Legend( 12 ) ) ),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model(
12,
Properties( 5, {Marker( "FilledCircle" )}, Item ID( "Start", 1 ) ),
Properties( 6, {Marker( "FilledCircle" )}, Item ID( "Stop", 1 ) )
)}
),
Dispatch( {}, "graph title", TextEditBox, {Set Text( "Start - Stop Chart" )} )
)
);
// Remove Start and Stop from legend
lgnd = gb << Get Legend Display;
items = lgnd << Get Items;
For Each( {item}, items,
If( item << Get Label == "Start" | item << Get Label == "Stop",
item << Set Visible( 0 )
)
);
// Set default Value Colors if not set
if( isEmpty(dt:step << get property( "value colors" )),
dt:step << set property( "value colors", "" );
);
// Get the colors to use
colors = dt:step << get property( "value colors" );
// Find the labels for the Y Axis
Summarize( dt, levels = by( :step ) );
// Add a Graphics Script to create the bars on the graph
fb = Report( gb )[framebox( 1 )];
fb << add graphics script(
// Get the colors to use
colors = dt:step << get property( "value colors" );
For Each Row(
cpoint = Contains( levels, :step ) - 1;
Fill Color( Num( Word( 3, Char( colors[cpoint + 1] ), " " ) ) );
Rect( :start, cPoint + .4, :stop, cPoint - .4, 1 );
);
);
Re: ¿Cómo hago gráficos de barras de inicio y fin?Hay muchas opciones de JSL para algo como esto. Establecer expresión de marcador probablemente sea la mejor opción si se puede entender cómo se usa (no tiene mucha documentación). Aquí está mi explicación rápida sobre cómo usar Establecer expresión de dibujo de marcador: se puede simplificar con un solo marcador, pero tener dos permite al usuario seleccionar la fila desde ambos extremos.
Names Default To Here(1);
dt = New Table("Untitled 2",
Add Rows(12),
Compress File When Saved(1),
New Column("Step",
Character,
"Nominal",
Set Property("Value Colors", {"fan" = -15113984, "heater1" = -5682409, "heater2" = -40563, "injector1" = -29362, "mixer" = -13983232}),
Set Values({"mixer", "heater1", "injector1", "mixer", "heater2", "injector1", "heater1", "mixer", "heater2", "mixer", "fan", "mixer"})
),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([0, 1, 4, 6, 10.300000000000001, 12, 16, 18, 23.399999999999999, 24, 24, 30])
),
New Column("Stop",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([2, 12.300000000000001, 4.5, 8, 13, 12.5, 25.399999999999999, 20, 30, 26, 45, 40])
)
);
dt << Color or Mark by Column(:Step, Color(1), Marker(0));
gb = dt << Graph Builder(Variables(X(:Start), X(:Stop, Position(1)), Y(:Step), Color(:Step)),
Elements(Points(X(1), X(2), Y, Legend(7))),
SendToReport(
Dispatch({}, "400", ScaleBox,
{Legend Model(
7,
Properties(0, {Marker("FilledSquare")}, Item ID("fan", 1)),
Properties(1, {Marker("FilledSquare")}, Item ID("heater1", 1)),
Properties(2, {Marker("FilledSquare")}, Item ID("heater2", 1)),
Properties(3, {Marker("FilledSquare")}, Item ID("injector1", 1)),
Properties(4, {Marker("FilledSquare")}, Item ID("mixer", 1))
)}
),
Dispatch({}, "400", LegendBox,
{Legend Position({7, [0, 1, 2, 3, 4, -1, -1]})}
)
)
);
frame = Report(gb)[FrameBox(1)];
seg = (frame << FindSeg(Marker Seg(1)));
seg << Set Marker Draw Expr(
Function({this seg, this row, x, y, size, row state},
Fill Color(Color Of(Row State(this row)));
Rect(x, y + 0.3, x + (:Stop[this row] - x) / 2 + 0.1, y - 0.3, 1)
)
);
seg = (frame << FindSeg(Marker Seg(2)));
seg << Set Marker Draw Expr(
Function({this seg, this row, x, y, size, row state},
Fill Color(Color Of(Row State(this row)));
Rect(x - (x - :Start[this row]) / 2 - 0.1, y + 0.3, x, y - 0.3, 1)
)
);
Probablemente también existan opciones en las que modifiques considerablemente tus datos para que se ajusten únicamente a las necesidades de gráficos.
Re: ¿Cómo hago gráficos de barras de inicio y fin?¡Guau, esto es increíble!
Quizás se podría eliminar el "/2" y dibujar dos rectángulos superpuestos. Así, las barras se mantienen estables incluso si el inicio o el final están cerca del borde o incluso fuera del gráfico.
Re: ¿Cómo hago gráficos de barras de inicio y fin?Hay infinitas maneras de hacerlo. Elige la que mejor se adapte a tus necesidades (o crea la tuya propia). Recortar de principio a fin, utilizando el punto medio, permite usar fácilmente marcadores de inicio/fin, por ejemplo, y añadir un marcador adicional al centro para que el usuario haga clic.

Re: ¿Cómo hago gráficos de barras de inicio y fin?En lugar de
Color Of(Row State(this row))
¿ Establecer marcador Dibujar Expr() también puede usar el tema de color definido a través de la zona de colocación de color?
¿Hay alguna función incorporada que haga algo como...
legend = gb << get legend server;
items = {};
for each({list}, legend << get legend items, Insert Into(items, list));
gradient = Filter Each({item}, items, item << get Type == "Gradient");
if(not(N items(gradient)), Caption("no gradient"); stop());
gradient = gradient[1];
settings = gradient << Get Gradient Settings;
colorTheme = settings["Color Theme"];
colors = if(is list(colorTheme) ,
colorTheme[3],
Get Color Theme Detail( colorTheme )[3]);
colors = Matrix( Remove( colors, N Items( colors ) ) );
xs = ((1 :: N Items( colors[0, 1] )) - 1) / (N Items( colors[0, 1] ) - 1);
scale = settings["Scale Values"];
reverse = settings["Reverse Gradient"];
min = scale[If( reverse, 2, 1 )];
max = scale[If( reverse, 1, 2 )];
Eval(
Eval Expr(
col = Function( {x},
x2 = (x - Expr( min )) / (Expr( max - min ));
Eval List(
{Interpolate( x2, xs, Expr( colors[0, 1] ) ), Interpolate( x2, xs, Expr( colors[0, 2] ) ),
Interpolate( x2, xs, Expr( colors[0, 3] ) )}
);
)
)
);
Re: ¿Cómo hago gráficos de barras de inicio y fin?Es interesante que "Tamaño" se encuentra entre los parámetros que se transfieren a
Set Marker Draw Expr
y ese color no es.
Re: ¿Cómo hago gráficos de barras de inicio y fin?El método de dibujo de rectángulos de JSL crea la imagen correcta, y estoy deseando aprender cómo funciona en JMP. Tendré que experimentar más con él.
Sin embargo, perdemos la posibilidad de hacer clic dentro de las barras para seleccionar las filas correspondientes en la tabla de datos. Mi conjunto de datos también es bastante grande (con varios millones de filas) y está dividido en conjuntos que se clasifican por una cuarta columna que se integra en el filtro local. De esta forma, podemos ver cualquier conjunto de resultados rápidamente en la misma ventana. Sé que es posible codificar el JSL para que actualice las barras cada vez que cambia el filtro de datos local, pero añade otra capa de complejidad.
Creo que enviaré un elemento de la lista de deseos para corregir/actualizar la configuración "Superposición de barras" para permitir que la columna "ID" colapse las diferentes filas en una sola cuando se usa como superposición.
¡Respuestas impresionantes! ¡Gracias a todos los que respondieron!
Re: ¿Cómo hago gráficos de barras de inicio y fin?Por ahora, usaría la expresión de dibujo del marcador y posiblemente añadiría puntos adicionales dentro del rectángulo. Gestionar el color es un poco complicado, ya que no creo que se pueda acceder a él desde la función "set marker expr", pero sí se puede gestionar, por ejemplo, con los estados de fila, añadiendo una columna de color a la tabla o seleccionando el color del marcador. Podría haber problemas con los filtros de datos locales, así que probablemente evitaría seleccionarlos desde "marker -> use color column or row states".
Creo que la expresión de dibujo de marcador debería gestionar correctamente el filtro de datos local. No he comprobado su eficacia con una gran cantidad de datos, pero probablemente se puedan implementar optimizaciones si esto supone un problema. También se puede aumentar la altura de las barras a 0,4 (o valores muy cercanos a 0,5) para que no se superpongan. En este caso, sustituyo el marcador central por el rectángulo y selecciono el color directamente del estado de la fila.
Names Default To Here(1);
dt = New Table("Demo",
Add Rows(12),
Compress File When Saved(1),
New Column("Step", Character, "Nominal", Set Values({"mixer", "heater1", "injector1", "mixer", "heater2", "injector1", "heater1", "mixer", "heater2", "mixer", "fan", "mixer"})),
New Column("Start", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 4, 6, 10.3, 12, 16, 18, 23.4, 24, 24, 30])),
New Column("Stop", Numeric, "Continuous", Format("Best", 12), Set Values([2, 12.3, 4.5, 8, 13, 12.5, 25.4, 20, 30, 26, 45, 40])),
New Column("G", Character, "Nominal", Set Values({"G1", "G1", "G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G2", "G2"}))
);
dt << New Column("Middle", Numeric, Continuous, Formula(
Mean(:Start, :Stop);
));
Column(dt, "Step") << Set Property("Value Colors", {"fan" = -15113984, "heater1" = -5682409, "heater2" = -40563, "injector1" = -29362, "mixer" = -13983232});
dt << Color or Mark by Column(:Step, Color(1), Marker(0));
gb = dt << Graph Builder(
Size(528, 454),
Show Control Panel(0),
Variables(X(:Start), X(:Stop, Position(1)), X(:Middle, Position(1)), Y(:Step), Color(:Step)),
Elements(Points(X(1), X(2), X(3), Y, Legend(10))),
Local Data Filter(Add Filter(columns(:G))),
SendToReport(
Dispatch({}, "400", ScaleBox,
{Legend Model(
10,
Properties(5, {Marker("Right Arrowhead")}, Item ID("Start", 1)),
Properties(6, {Marker("Left Arrowhead")}, Item ID("Stop", 1))
)}
),
Dispatch({}, "400", LegendBox, {Legend Position({10, [0, 1, 2, 3, 4, 5, 6, -1]})})
)
);
frame = Report(gb)[FrameBox(1)];
seg = (frame << FindSeg(Marker Seg(3)));
seg << Set Marker Draw Expr(
Function({this seg, this row, x, y, size, row state},
Fill Color(Color Of(row state));
Rect(:Start[this row], y + 0.4, :Stop[this row], y - 0.4, 1)
)
);


También es bastante fácil que JMP se bloquee cuando comienzas a jugar con ellos.
Re: ¿Cómo hago gráficos de barras de inicio y fin?Será mucho más fácil en septiembre.:)
Re: ¿Cómo hago gráficos de barras de inicio y fin?En el ejemplo que di, al usar Rect() en un << Agregar script de gráficos, puede hacer clic en el punto de datos de inicio o detención y seleccionará las filas.

Re: ¿Cómo hago gráficos de barras de inicio y fin?Si puede, regístrese en el programa Early Adopter de JMP 19 y brinde comentarios sobre las mejoras planificadas del elemento Línea que brindarán otra forma de hacerlo.
Re: ¿Cómo hago gráficos de barras de inicio y fin?Jim, sí, vi esto y es una excelente solución. En mi caso, algunas barras serán muy largas y esperamos que la línea de tiempo se amplíe con frecuencia, lo que significa que tendría que trazar un montón de puntos a intervalos a lo largo de la barra. También estoy intentando crear este trazador para que lo usen otros usuarios que no estén familiarizados con JMP, por lo que obligarlos a seleccionar un punto final de la barra requeriría capacitación y añadiría fricción al proceso.
Re: ¿Cómo creo gráficos de barras de inicio/parada?JMP19 ya está disponible, lo que facilita enormemente la creación de gráficos como este:

dt = New Table( "log",
Add Rows( 12 ),
New Column( "Step",
Character,
Set Values(
{"mixer", "heater1", "injector1", "mixer", "heater2", "injector1",
"heater1", "mixer", "heater2", "mixer", "fan", "mixer"}
)
),
New Column( "Start",
Set Values(
[0, 1, 4, 6, 10.3, 12, 16, 18, 23.4, 24, 24,30]
)
),
New Column( "Stop",
Set Values(
[2, 12.3, 4.5, 8, 13, 12.5, 25.4, 20, 30, 26,45, 40]
)
)
);
Graph Builder(
Size( 493, 262 ),
Graph Spacing( 4 ),
Variables( X( :Start ), X( :Stop, Position( 1 ) ), Y( :Step ), Color( :Step ) ),
Elements( Line( X( 1 ), X( 2 ), Y, Ordering( "Within Row" ) ) ),
);