Wie erstelle ich Start/Stopp-Balkendiagramme?Angenommen, ich habe diese Daten:
| Schritt | Start | Stoppen |
| Mischer | 0 | 2 |
| Heizung1 | 1 | 12.3 |
| Injektor1 | 4 | 4.5 |
| Mischer | 6 | 8 |
| Heizung2 | 10.3 | 13 |
| Injektor1 | 12 | 12,5 |
| Heizung1 | 16 | 25,4 |
| Mischer | 18 | 20 |
| Heizung2 | 23.4 | 30 |
| Mischer | 24 | 26 |
| Lüfter | 24 | 45 |
| Mischer | 30 | 40 |
... und ich möchte dieses Diagramm erstellen (nur die Balken):

Ist das mit GraphBuilder möglich? (Beachten Sie, dass dieses Bild ein Modell mit PowerPoint ist)
Datenexploration und -visualisierungBetreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Hallo @BHarris ,
Ich kann Ihre PowerPoint-Präsentation nicht direkt reproduzieren, aber ich habe möglicherweise etwas, das dem, was Sie beabsichtigen, ähnlich genug ist:

Im Gegensatz zu Ihrem Bild sind die verschiedenen Bereiche nicht vollständig ausgerichtet, da ich für jeden Wertebereich eine eindeutige Kennung benötige.
Ich denke, die Balken könnten zur besseren Lesbarkeit vergrößert werden.
Sie können sich das Skript in der beigefügten Datentabelle ansehen.
BEARBEITEN: Wenn Sie eine ID-Spalte mit weniger Ebenen verwenden, sieht das Balkendiagramm besser aus:

Beide Diagrammskripte sind in der beigefügten Datentabelle gespeichert.
Betreff: Wie erstelle ich Start-/Stopp-Balkendiagramme?Netter Ansatz 
Alternativ zu Überlagerung könnte man auch die auf der Y-Achse verschachtelte ID verwenden:

Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Beide Optionen erzeugen viel Leerraum, da jedes Ein/Aus eine eigene horizontale Zeile erhält und es in meinem Anwendungsfall viele Ein/Aus-Schalter geben kann. Die Balkendiagramme haben eine rote Dreieck-„Überlappungs“-Einstellung, die eigentlich funktionieren sollte, aber selbst bei „Voll“ scheint sie nichts zu bewirken. Daher hoffte ich, dass es eine versteckte Option oder einen JSL-Ansatz geben könnte, der die Balken vertikal ausrichtet.
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Hier ist mein Ansatz zum Erstellen des Diagramms

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 );
);
);
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Es gibt viele JSL-Optionen für so etwas. Set Marker Expr wäre wahrscheinlich die beste Option, wenn Sie wissen, wie es verwendet wird (es gibt keine wirkliche Dokumentation). Hier ist mein kurzer Ansatz mit Set Marker Draw Expr. Dies lässt sich mit nur einem Marker vereinfachen, aber mit zwei Markern können Benutzer die Zeile von beiden Enden aus auswählen.
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)
)
);
Es gibt höchstwahrscheinlich auch Optionen, bei denen Sie Ihre Daten stark ändern, um sie nur an die Grafikanforderungen anzupassen.
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?wow, das ist unglaublich!
Eventuell das "/2" entfernen und zwei überlappende Rechtecke zeichnen. Dann bleibt der Balken stabil, auch wenn Start oder Stopp nahe am Rand oder sogar außerhalb des Graphen liegen.
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Es gibt grundsätzlich unendlich viele Möglichkeiten, dies zu tun. Wählen Sie die für Ihre Bedürfnisse am besten geeignete aus (oder erstellen Sie Ihre eigene). Ein Rechteck von Anfang bis Ende unter Verwendung des Durchschnittspunkts ermöglicht beispielsweise die einfache Verwendung von Start-/Stopp-Markierungen und fügt in der Mitte zusätzliche „Markierungen“ hinzu, auf die der Benutzer klicken kann.

Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Anstatt
Color Of(Row State(this row))
Kann Marker setzen Draw Expr() auch das über die Color-Dropzone definierte Farbthema verwenden?
Gibt es eine eingebaute Funktion, die so etwas macht wie
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] ) )}
);
)
)
);
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Interessant ist, dass die Größe zu den Parametern gehört, die an
Set Marker Draw Expr
und diese Farbe ist es nicht.
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Der JSL-Rechteck-Zeichenansatz erzeugt tatsächlich das korrekte Bild, und ich bin gespannt, wie es in JMP funktioniert. Ich werde noch mehr damit experimentieren müssen.
Was wir jedoch verlieren, ist die Möglichkeit, innerhalb der Balken zu klicken, um die entsprechenden Zeilen in der Datentabelle auszuwählen. Mein Datensatz ist zudem recht groß (mehrere Millionen Zeilen) und in Gruppen unterteilt, die durch eine vierte Spalte, die in den lokalen Filter eingeht, kodiert sind. So können wir alle Ergebnisse schnell im selben Fenster betrachten. Ich weiß, dass es möglich ist, die JSL so zu programmieren, dass die Balken aktualisiert werden, sobald sich der lokale Datenfilter ändert, aber das erhöht die Komplexität zusätzlich.
Ich denke, ich werde einen Wunschlisteneintrag einreichen, um die Einstellung „Balkenüberlappung“ zu reparieren/aktualisieren, damit die Spalte „ID“ die verschiedenen Zeilen zu einer einzigen zusammenfassen kann, wenn sie als Überlagerung verwendet wird.
Die Reaktionen waren beeindruckend! Vielen Dank an alle, die geantwortet haben!
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Im Moment würde ich den Marker-Zeichenausdruck verwenden und möglicherweise zusätzliche Punkte innerhalb des Rechtecks hinzufügen. Die Farbverwaltung ist etwas umständlich, da ich glaube, dass man innerhalb der Funktion „Marker-Ausdruck festlegen“ nicht auf die Farbe zugreifen kann. Man kann aber beispielsweise mit Zeilenzuständen umgehen, indem man der Tabelle eine Farbspalte hinzufügt oder die Farbe aus dem Marker auswählt. Es könnte Probleme mit lokalen Datenfiltern geben, daher würde ich wahrscheinlich vermeiden, sie aus dem Marker auszuwählen, indem ich die Farbspalte oder Zeilenzustände verwende.
Ich denke, der Ausdruck zum Zeichnen von Markierungen sollte den lokalen Datenfilter gut verarbeiten können. Ich habe nicht getestet, wie gut das bei großen Datenmengen funktioniert, aber es gibt höchstwahrscheinlich Optimierungen, die vorgenommen werden könnten, falls dies zum Problem wird. Sie können die Höhe der Balken auch auf 0,4 (oder Werte nahe 0,5) erhöhen, und sie sollten sich nicht überlappen. In diesem Fall ersetze ich die mittlere Markierung durch das Rechteck und wähle die Farbe direkt aus dem Zeilenstatus.
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)
)
);


Außerdem kann JMP ziemlich leicht zum Absturz gebracht werden, wenn Sie anfangen, damit herumzuspielen.
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Wird im September viel einfacher:)
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?In dem Beispiel, das ich gegeben habe, können Sie mit Rect() in einem << Add Graphics Script auf den Start- oder Stopp-Datenpunkt klicken und die Zeilen auswählen

Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Melden Sie sich nach Möglichkeit für das JMP 19 Early Adopter-Programm an und geben Sie Feedback zu den geplanten Verbesserungen des Linienelements, die eine weitere Möglichkeit hierfür bieten.
Betreff: Wie erstelle ich Start/Stopp-Balkendiagramme?Jim, ja, ich habe das gesehen, und es ist eine tolle Lösung. In meinem Fall werden einige Balken sehr lang sein, und wir erwarten, dass wir häufig in die Zeitleiste hineinzoomen. Das bedeutet, dass ich eine ganze Reihe von Punkten in Abständen entlang des Balkens zeichnen müsste. Ich versuche auch, diesen Plotter für andere Benutzer zugänglich zu machen, die mit JMP nicht so vertraut sind. Daher würde es Schulung erfordern und den Prozess erschweren, sie zur Auswahl eines Balkenendpunkts zu zwingen.
Betreff: Wie erstelle ich Start/Stop-Balkendiagramme?JMP19 ist jetzt verfügbar und macht das Erstellen solcher Diagramme kinderleicht:

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