開始/停止棒グラフを作成するにはどうすればよいですか?次のようなデータがあるとします:
| ステップ | 始める | 停止 |
| ミキサー | 0 | 2 |
| ヒーター1 | 1 | 12.3 |
| インジェクター1 | 4 | 4.5 |
| ミキサー | 6 | 8 |
| ヒーター2 | 10.3 | 13 |
| インジェクター1 | 12 | 12.5 |
| ヒーター1 | 16 | 25.4 |
| ミキサー | 18 | 20 |
| ヒーター2 | 23.4 | 30 |
| ミキサー | 24 | 26 |
| ファン | 24 | 45 |
| ミキサー | 30 | 40 |
...そして、このプロット(バーのみ)を作成したいと思います。

GraphBuilder でそれが可能でしょうか? (この画像は PowerPoint のモックアップです)
データの探索と視覚化Re: 開始/停止棒グラフを作成するにはどうすればよいですか?こんにちは@Bハリス 、
あなたがパワーポイントで提示しているものを直接再現することはできませんが、あなたが意図しているものと十分に似たものを持っているかもしれません。

あなたの画像とは異なり、各値の範囲に一意の識別子が必要なため、さまざまな範囲は完全には揃っていません。
読みやすくするためにバーを拡大できると思います。
添付のデータテーブルでスクリプトを確認できます。
編集: レベルが少ない ID 列を使用すると、棒グラフの見栄えが良くなります。

両方のグラフ スクリプトは、添付のデータ テーブルに保存されます。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?素晴らしいアプローチですね:)
かぶせるの代わりに、Y 軸にネストされた ID を使用することもできます。

Re: 開始/停止棒グラフを作成するにはどうすればよいですか?これらのオプションは両方とも、各オン/オフが独自の水平行を取得するため、多くの空白を作成しますが、私の使用例ではオン/オフが多数存在する可能性があります。棒グラフには赤い三角形の「オーバーラップ」設定があり、これは機能するはずですが、「フル」にしても何も機能しないようです。そのため、バーを垂直に揃えておくための非表示のオプションまたは JSL アプローチがあるのではないかと期待していました。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?グラフを作成するための私のアプローチは次のとおりです

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: 開始/停止棒グラフを作成するにはどうすればよいですか?このような機能には、多くの JSL オプションがあります。Set Marker Expr は、その使い方がわかればおそらく最適です (ドキュメントはありません)。ここでは、Set Marker Draw Expr を使用した簡単な例を示します。マーカーを 1 つだけ使用すれば、より簡単にできますが、2 つ使用すれば、ユーザーは両端から行を「選択」できます。
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)
)
);
グラフ作成のニーズに合わせてデータを大幅に変更するオプションも考えられます。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?わあ、これはすごいですね!
おそらく「/2」を削除して、2 つの重なり合う四角形を描画します。そうすれば、開始または終了がグラフの端に近い場合やグラフの外側にある場合でも、バーは安定したままになります。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?基本的に、これを行う方法は無限にあります。ニーズに最適なものを選択してください (または独自のものを作成してください)。平均ポイントを利用しながら開始から終了までの四角形を使用すると、たとえば開始/停止マーカーを簡単に使用でき、ユーザーがクリックできるように中央に追加の「マーカー」を追加できます。

Re: 開始/停止棒グラフを作成するにはどうすればよいですか?の代わりに
Color Of(Row State(this row))
Set Marker Draw Expr() は、 Color ドロップゾーンで定義されたカラーテーマも使用できますか?
次のような機能を持つ組み込み関数はありますか?
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: 開始/停止棒グラフを作成するにはどうすればよいですか?「サイズ」が転送されるパラメータの中にあるのは興味深いことです。
Set Marker Draw Expr
そしてその色はそうではありません。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?JSL の四角形描画アプローチでは正しい画像が作成されます。JMP でどのように機能するかを知ることができてうれしいです。もっと試してみる必要があります。
ただし、バー内をクリックしてデータ テーブル内の対応する行を選択する機能は失われます。私のデータセットもかなり大きく (数百万行)、ローカル フィルターに入る 4 番目の列をキーとするセットに分割されています。この方法により、同じウィンドウで結果セットをすばやく確認できます。ローカル データ フィルターが変更されるたびにバーを更新するように JSL をコーディングすることは可能ですが、複雑さがさらに増します。
「バー オーバーラップ」設定を修正/更新して、「ID」列をオーバーレイとして使用したときに異なる行を 1 つに折りたためるようにする要望リスト項目を提出するつもりです。
素晴らしい反響をいただきました! 回答してくださった皆様、ありがとうございました!
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?今のところ、マーカー描画式を使用して、「四角形」内にポイントを追加する可能性があります。set marker expr 関数内で色にアクセスできないと思われるため、色の処理は少し面倒ですが、たとえば行の状態、テーブルへの色列の追加、またはマーカーから色の選択などを使用して管理できます。ローカル データ フィルターに問題がある可能性があるため、マーカーからフィルターを選択することは避け、色列または行の状態を使用します。
マーカー描画式はローカルデータフィルターをうまく処理できると思います。大量のデータがある場合にこれがどれだけうまく機能するかはテストしていませんが、それが問題になる場合は最適化できる可能性があります。バーの高さを 0.4 (または 0.5 に非常に近い値) に増やすこともできますが、バーは重なりません。この場合、中央のマーカーを長方形に置き換え、行の状態から直接色を選択します。
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)
)
);


また、これらをいじり始めると、JMP がクラッシュする可能性もかなり高くなります。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?9月にはもっと楽になるだろう:)
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?私が示した例では、<<グラフィックススクリプトの追加でRect()を使用して、開始または停止データポイントをクリックすると、行が選択されます。

Re: 開始/停止棒グラフを作成するにはどうすればよいですか?可能であれば、JMP 19 早期導入プログラムにサインアップして、別の方法を提供する予定のライン要素の機能強化に関するフィードバックを提供してください。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?Jim、はい、私はこれを見ました。これは素晴らしい回避策です。私の場合、いくつかのバーは非常に長く、タイムラインで頻繁にズームインされることが予想されるため、バーの間隔ごとに多数のポイントをプロットする必要があります。また、このプロッターを JMP にあまり詳しくない他の人が使用できるように作成しようとしているため、バーのエンドポイントを選択させるにはトレーニングが必要になり、プロセスに支障をきたすことになります。
Re: 開始/停止棒グラフを作成するにはどうすればよいですか?JMP19 が利用可能になりました。これにより、次のようなプロットを非常に簡単に作成できます。

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