Come si creano grafici a barre con inizio/fine?Supponiamo che io abbia questi dati:
| Fare un passo | Inizio | Fermare |
| miscelatore | 0 | 2 |
| riscaldatore1 | 1 | 12.3 |
| iniettore1 | 4 | 4.5 |
| miscelatore | 6 | 8 |
| riscaldatore2 | 10.3 | 13 |
| iniettore1 | 12 | 12.5 |
| riscaldatore1 | 16 | 25.4 |
| miscelatore | 18 | 20 |
| riscaldatore2 | 23.4 | 30 |
| miscelatore | 24 | 26 |
| fan | 24 | 45 |
| miscelatore | 30 | 40 |
... e voglio realizzare questo grafico (solo le barre):

È possibile con GraphBuilder? (nota che questa immagine è un mockup con PowerPoint)
Esplorazione e visualizzazione dei datiR: Come si creano grafici a barre con inizio/fine?Ciao @BHarris ,
Non sono in grado di riprodurre direttamente ciò che presenti in PowerPoint, ma potrei avere qualcosa di abbastanza simile a ciò che intendi avere:

A differenza della tua immagine, i diversi intervalli non sono completamente allineati, poiché ho bisogno di un identificatore univoco per ogni intervallo di valori.
Penso che le barre potrebbero essere ingrandite per una migliore leggibilità.
Potete dare un'occhiata allo script nella tabella dati allegata.
MODIFICA: Utilizzando una colonna ID con meno livelli, il grafico a barre appare migliore:

Entrambi gli script grafici vengono salvati nella tabella dati allegata.
R: Come si creano grafici a barre con inizio/fine?Bel approccio : )
In alternativa a Sovrapposizione , si potrebbe anche utilizzare l'ID annidato sull'asse Y:

R: Come si creano grafici a barre con inizio/fine?Entrambe queste opzioni creano un sacco di spazio vuoto perché ogni on/off ha la sua riga orizzontale e ci possono essere molti on/off nel mio caso d'uso. I grafici a barre hanno un'impostazione di "sovrapposizione" a triangolo rosso che sembra funzionare, ma anche su "Full" non sembra fare nulla, quindi speravo che ci potesse essere un'opzione nascosta o un approccio JSL che avrebbe mantenuto le barre allineate verticalmente.
R: Come si creano grafici a barre con inizio/fine?Ecco il mio approccio alla creazione del grafico

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 );
);
);
R: Come si creano grafici a barre con inizio/fine?Ci sono molte opzioni JSL per qualcosa del genere. Set Marker Expr sarebbe probabilmente la migliore se riesci a capire come viene usata (non ha davvero documentazione). Ecco la mia rapida interpretazione usando Set Marker Draw Expr, questo può essere reso più semplice usando un solo marcatore ma averne due consente all'utente di "selezionare" la riga da entrambe le estremità
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)
)
);
Ci sono anche opzioni molto probabili in cui modifichi notevolmente i tuoi dati per adattarli solo alle esigenze grafiche.
R: Come si creano grafici a barre con inizio/fine?Wow, è incredibile!
Forse rimuovi "/2" e disegna 2 rettangoli sovrapposti. Quindi le barre rimangono stabili anche se l'inizio o la fine sono vicini al bordo o addirittura fuori dal grafico.
R: Come si creano grafici a barre con inizio/fine?Ci sono fondamentalmente infiniti modi per farlo. Scegli quello più adatto alle tue esigenze (o creane uno tuo). Rettangolare dall'inizio alla fine mentre utilizzi il punto medio consente di usare facilmente i marcatori di inizio/fine, ad esempio aggiungendo un "marcatore" extra al centro affinché l'utente possa cliccare.

R: Come si creano grafici a barre con inizio/fine?Invece di
Color Of(Row State(this row))
Imposta marcatore Disegna Expr() può usare anche il tema colore definito tramite la zona di rilascio Colore?
Esiste una funzione integrata che fa qualcosa del genere
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] ) )}
);
)
)
);
R: Come si creano grafici a barre con inizio/fine?È interessante che "Size" sia tra i parametri che vengono trasferiti a
Set Marker Draw Expr
e quel Colore non lo è.
R: Come si creano grafici a barre con inizio/fine?L'approccio JSL rect-drawing crea l'immagine corretta e sono emozionato di scoprire come funziona in JMP. Dovrò giocarci ancora.
Ciò che perdiamo, tuttavia, è la possibilità di cliccare all'interno delle barre per selezionare le righe corrispondenti nella tabella dati. Il mio dataset è anche piuttosto grande (molti milioni di righe) ed è diviso in set che sono codificati da una quarta colonna che va nel filtro locale. In questo modo possiamo guardare rapidamente qualsiasi set di risultati nella stessa finestra. So che è possibile codificare il JSL per aggiornare le barre ogni volta che cambia il filtro dati locale, ma aggiunge un altro livello di complessità.
Penso che invierò un elemento della lista dei desideri per correggere/aggiornare l'impostazione "Sovrapposizione barre" per consentire alla colonna "ID" di comprimere le diverse righe in una sola quando viene utilizzata come sovrapposizione.
Risposte impressionanti da parte di tutti! Grazie a tutti coloro che hanno risposto!
R: Come si creano grafici a barre con inizio/fine?Per ora userei l'espressione di disegno del marcatore e aggiungerei eventualmente punti extra all'interno del "rettangolo". Gestire il colore è un po' fastidioso perché non credo che tu possa accedere al colore all'interno della funzione set marker expr, ma puoi gestirlo ad esempio con gli stati di riga, aggiungendo una colonna di colore alla tua tabella o scegliendo il colore dal marcatore. Potrebbero esserci alcuni problemi con i filtri dei dati locali, quindi probabilmente eviterei di sceglierli da marcatore -> usa colonna di colore o stati di riga.
Penso che l'espressione di disegno del marcatore dovrebbe gestire bene il filtro dati locale. Non ho testato quanto bene funzioni quando hai una grande quantità di dati, ma ci sono probabilmente delle ottimizzazioni che potrebbero essere fatte se diventa un problema. Puoi anche aumentare l'altezza delle barre a 0,4 (o valori molto vicini a 0,5) e non dovrebbero sovrapporsi. In questo caso sostituisco il marcatore centrale con il rettangolo e scelgo direttamente il colore dallo stato della riga
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)
)
);


Inoltre è abbastanza facile che JMP vada in crash quando si inizia a giocare con queste cose.
R: Come si creano grafici a barre con inizio/fine?Sarà molto più facile a settembre:)
R: Come si creano grafici a barre con inizio/fine?Nell'esempio che ho fornito, utilizzando Rect() in uno script << Aggiungi grafica, puoi fare clic sul punto dati di inizio o fine e verranno selezionate le righe

R: Come si creano grafici a barre con inizio/fine?Se possibile, iscriviti al programma JMP 19 Early Adopter e fornisci il tuo feedback sui miglioramenti pianificati dell'elemento Line, che forniranno un altro modo per raggiungere questo obiettivo.
R: Come si creano grafici a barre con inizio/fine?Jim, sì, l'ho visto, ed è un'ottima soluzione alternativa. Nel mio caso, alcune delle barre saranno molto lunghe e ci aspettiamo di essere spesso ingrandite sulla timeline, il che significa che dovrei tracciare un sacco di punti a intervalli lungo la barra. Sto anche cercando di rendere questo plotter utilizzabile da altri che non hanno familiarità con JMP, e quindi costringerli a selezionare un endpoint della barra richiederebbe formazione e aggiungerebbe attrito al processo.
Re: Come si creano grafici a barre di avvio/arresto?JMP19 è ora disponibile e semplifica notevolmente la creazione di grafici come questo:

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" ) ) ),
);