Comment créer des graphiques à barres de démarrage/arrêt ?Supposons que j'ai ces données :
| Étape | Commencer | Arrêt |
| mixer | 0 | 2 |
| chauffage1 | 1 | 12.3 |
| injecteur1 | 4 | 4,5 |
| mixer | 6 | 8 |
| chauffage2 | 10.3 | 13 |
| injecteur1 | 12 | 12,5 |
| chauffage1 | 16 | 25,4 |
| mixer | 18 | 20 |
| chauffage2 | 23.4 | 30 |
| mixer | 24 | 26 |
| ventilateur | 24 | 45 |
| mixer | 30 | 40 |
... et je veux faire ce tracé (juste les barres) :

Est-ce possible avec GraphBuilder ? (Notez que cette image est une maquette PowerPoint)
Exploration et visualisation des donnéesRe : Comment créer des graphiques à barres de démarrage/arrêt ?Salut @BHarris ,
Je ne suis pas en mesure de reproduire directement ce que vous présentez dans powerpoint, mais j'ai peut-être quelque chose d'assez similaire à ce que vous avez l'intention d'avoir :

Contrairement à votre image, les différentes plages ne sont pas complètement alignées, car j'ai besoin d'avoir un identifiant unique pour chaque plage de valeurs.
Je pense que les barres pourraient être agrandies pour une meilleure lisibilité.
Vous pouvez jeter un œil au script dans le tableau de données ci-joint.
EDIT : En utilisant une colonne ID avec moins de niveaux, le graphique à barres est plus beau :

Les deux scripts graphiques sont enregistrés dans la table de données ci-jointe.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Belle approche : )
En alternative à Recouvrir , on pourrait également utiliser l'ID imbriqué sur l'axe Y :

Re : Comment créer des graphiques à barres de démarrage/arrêt ?Ces deux options créent beaucoup d'espaces vides, car chaque activation/désactivation dispose de sa propre ligne horizontale, et il peut y avoir de nombreux cas d'utilisation. Les graphiques à barres ont un paramètre de chevauchement avec un triangle rouge qui semble fonctionner, mais même en mode « Complet », il ne semble rien faire. J'espérais donc qu'il existerait une option cachée ou une approche JSL permettant de maintenir l'alignement vertical des barres.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Voici mon approche pour créer le graphique

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 : Comment créer des graphiques à barres de démarrage/arrêt ?Il existe de nombreuses options JSL pour ce type de tâche. Set Marker Expr serait probablement la meilleure option si vous comprenez son utilisation (elle manque cruellement de documentation). Voici mon exemple rapide d'utilisation de Set Marker Draw Expr : un seul marqueur peut simplifier la tâche, mais deux permettent de sélectionner la ligne aux deux extrémités.
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)
)
);
Il existe également très probablement des options dans lesquelles vous modifiez considérablement vos données pour répondre uniquement aux besoins graphiques.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?wow, c'est incroyable !
Vous pourriez peut-être supprimer le « /2 » et dessiner deux rectangles superposés. Les barres resteront alors stables, même si le début ou la fin est proche du bord, voire à l'extérieur du graphique.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Il existe une infinité de façons de procéder. Choisissez celle qui correspond le mieux à vos besoins (ou créez la vôtre). Rectifier du début à la fin tout en utilisant le point moyen permet d'utiliser facilement des marqueurs de début et de fin, par exemple en ajoutant un marqueur supplémentaire au centre pour que l'utilisateur puisse cliquer.

Re : Comment créer des graphiques à barres de démarrage/arrêt ?Au lieu de
Color Of(Row State(this row))
Définir le marqueur Dessiner Expr() peut-il également utiliser le thème de couleur défini via la zone de dépôt de couleur ?
Existe-t-il une fonction intégrée qui fait quelque chose comme
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 : Comment créer des graphiques à barres de démarrage/arrêt ?Il est intéressant de noter que « Taille » fait partie des paramètres qui sont transférés à
Set Marker Draw Expr
et cette couleur n'existe pas.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?L'approche de dessin rectangulaire JSL crée l'image correcte, et je suis ravi d'apprendre son fonctionnement dans JMP. Il faudra que je m'y intéresse davantage.
Ce que nous perdons, en revanche, c'est la possibilité de cliquer à l'intérieur des barres pour sélectionner les lignes correspondantes dans le tableau de données. Mon ensemble de données est également assez volumineux (plusieurs millions de lignes) et divisé en ensembles indexés par une quatrième colonne intégrée au filtre local. De cette façon, nous pouvons consulter rapidement n'importe quel ensemble de résultats dans la même fenêtre. Je sais qu'il est possible de coder le JSL pour mettre à jour les barres à chaque modification du filtre local, mais cela ajoute une complexité supplémentaire.
Je pense que je vais soumettre un élément de liste de souhaits pour corriger/mettre à jour le paramètre « Bar Overlap » pour permettre à la colonne « ID » de réduire les différentes lignes en une seule lorsqu'elle est utilisée comme superposition.
Des réponses impressionnantes de tous côtés ! Merci à tous ceux qui ont répondu !
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Pour l'instant, j'utiliserais l'expression de dessin du marqueur et j'ajouterais éventuellement des points supplémentaires dans le rectangle. La gestion des couleurs est un peu complexe, car je ne pense pas qu'il soit possible d'y accéder via la fonction « définir l'expression du marqueur ». Cependant, on peut gérer les états de ligne, par exemple en ajoutant une colonne de couleur à un tableau ou en sélectionnant la couleur à partir du marqueur. Des problèmes pourraient survenir avec les filtres de données locaux ; j'éviterais donc probablement de les sélectionner à partir du marqueur, puis d'utiliser la colonne de couleur ou les états de ligne.
Je pense que l'expression de dessin du marqueur devrait bien gérer le filtre de données locales. Je n'ai pas testé son efficacité avec de grandes quantités de données, mais des optimisations pourraient probablement être réalisées si cela pose problème. Vous pouvez également augmenter la hauteur des barres à 0,4 (ou à des valeurs très proches de 0,5) ; elles ne devraient pas se chevaucher. Dans ce cas, je remplace le marqueur du milieu par le rectangle et je sélectionne directement la couleur à partir de l'état de la ligne.
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)
)
);


Il est également assez facile de faire planter JMP lorsque vous commencez à jouer avec eux.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Cela deviendra beaucoup plus facile en septembre:)
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Dans l'exemple que j'ai donné, en utilisant Rect() dans un script << Ajouter des graphiques, vous pouvez cliquer sur le point de données de démarrage ou d'arrêt et il sélectionnera les lignes

Re : Comment créer des graphiques à barres de démarrage/arrêt ?Si vous le pouvez, inscrivez-vous au programme Early Adopter de JMP 19 et donnez votre avis sur les améliorations prévues des éléments de ligne qui offriront une autre façon de procéder.
Re : Comment créer des graphiques à barres de démarrage/arrêt ?Jim, oui, j'ai vu ça, et c'est une excellente solution. Dans mon cas, certaines barres seront très longues et nous nous attendons à ce que la chronologie soit souvent agrandie, ce qui implique que je devrais tracer de nombreux points à intervalles réguliers le long de la barre. J'essaie également de développer ce traceur pour que d'autres personnes moins familiarisées avec JMP puissent l'utiliser. Les obliger à sélectionner une extrémité de barre nécessiterait donc une formation et ajouterait des contraintes au processus.
Re: Comment créer des graphiques à barres de début/fin ?JMP19 est désormais disponible, ce qui simplifie grandement la création de graphiques comme celui-ci :

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