如何製作開始/停止長條圖?假設我有以下數據:
| 步 | 開始 | 停止 |
| 混合器 | 0 | 2 |
| 加熱器1 | 1 | 12.3 |
| 噴油嘴1 | 4 | 4.5 |
| 混合器 | 6 | 8 |
| 加熱器2 | 10.3 | 十三 |
| 噴油嘴1 | 12 | 12.5 |
| 加熱器1 | 16 | 25.4 |
| 混合器 | 18 | 20 |
| 加熱器2 | 23.4 | 三十 |
| 混合器 | 24 | 二十六 |
| 扇子 | 24 | 四十五 |
| 混合器 | 三十 | 40 |
……我想要製作這個圖(只是長條圖):

使用 GraphBuilder 可以實現嗎? (請注意,此圖像是使用 PowerPoint 製作的模型)
數據探索與視覺化回覆:如何製作開始/停止長條圖?你好@BHarris ,
我無法直接重現您在 PowerPoint 中呈現的內容,但我可能有一些與您想要的內容足夠相似的內容:

與您的影像不同,不同的範圍並非完全對齊,因為我需要為每個值範圍提供一個唯一的識別碼。
我認為可以放大這些欄位以提高可讀性。
您可以查看附加資料表中的腳本。
編輯:使用較少等級的 ID 列,長條圖看起來更好:

兩個圖形腳本均保存在附加的資料表中。
回覆:如何製作開始/停止長條圖?不錯的方法:)
作為覆蓋的替代,也可以使用嵌套在 Y 軸上的 ID:

回覆:如何製作開始/停止長條圖?這兩個選項都會產生大量的空白,因為每個開/關都有自己的水平行,並且在我的用例中可能會有很多開/關。條形圖有一個紅色三角形「重疊」設置,看起來應該可以工作,但即使在「完整」時它似乎也沒有任何作用,所以我希望可能有一個隱藏的選項或 JSL 方法可以讓條形圖保持垂直對齊。
回覆:如何製作開始/停止長條圖?這是我創建圖表的方法

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 );
);
);
回覆:如何製作開始/停止長條圖?對於類似這樣的事情,有很多 JSL 選項。如果您能弄清楚如何使用它,Set Marker Expr 很可能是最好的(它實際上沒有文件)。這是我使用 Set Marker Draw Expr 的快速操作,使用一個標記可以更簡單,但使用兩個標記可以讓使用者從兩端「選擇」行
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)
)
);
還有最有可能的選項,您可以大量修改資料以滿足繪圖需求。
回覆:如何製作開始/停止長條圖?哇,太棒了!
也許刪除“/2”並繪製 2 個重疊的矩形。這樣,即使開始或停止接近邊緣甚至在圖表之外,長條圖仍保持穩定。
回覆:如何製作開始/停止長條圖?基本上有無數種方法可以實現這一點。選擇最適合需求的(或創建您自己的)。從開始到結束的矩形同時利用平均點可以輕鬆使用開始/停止標記,例如同時在中心添加額外的「標記」以供使用者點擊。

回覆:如何製作開始/停止長條圖?而不是
Color Of(Row State(this row))
設定標記繪製 Expr()是否也可以使用透過 Color dropzone 定義的顏色主題?
是否有一個內建函數可以執行類似
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] ) )}
);
)
)
);
回覆:如何製作開始/停止長條圖?有趣的是,「大小」是傳輸到
Set Marker Draw Expr
而顏色則不是。
回覆:如何製作開始/停止長條圖?JSL 矩形繪製方法確實創建了正確的圖像,我很高興了解它在 JMP 中的工作原理。我需要多玩一下。
然而,我們失去了透過點擊條形圖內部來選擇資料表中對應行的能力。我的資料集也相當大(數百萬行),並被分成幾個集合,每個集合由進入本地過濾器的第 4 列作為鍵。這樣,我們就可以在同一視窗中快速查看任何一組結果。我知道只要本地資料過濾器發生變化,就可以透過編寫 JSL 程式碼來更新長條圖,但這又增加了另一層複雜性。
我想我會提交一個願望清單項目來修復/更新“條重疊”設置,以允許“ID”列在用作覆蓋時將不同的行折疊為單行。
各方反應令人印象深刻!感謝所有回覆的人!
回覆:如何製作開始/停止長條圖?現在,我將使用標記繪製表達式,並可能在“矩形”內添加額外的點。處理顏色有點煩人,因為我認為你不能在設定標記表達式函數中存取顏色,但你可以進行管理,例如使用行狀態,向表中添加顏色列或從標記中選擇顏色。本地資料過濾器可能存在一些問題,所以我可能會避免從標記中選擇它們->使用顏色列或行狀態。
我認為標記繪製表達式應該可以很好地處理本地資料過濾器。我還沒有測試過當你有大量數據時它的效果如何,但如果這成為一個問題,那麼最有可能的是可以進行優化。您也可以將條形的高度增加到 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 也很容易崩潰。
回覆:如何製作開始/停止長條圖?9 月會容易得多:)
回覆:如何製作開始/停止長條圖?在我給出的例子中,在<<新增圖形腳本中使用 Rect(),您可以單擊開始或停止資料點,它將選擇行

回覆:如何製作開始/停止長條圖?如果可以,請註冊 JMP 19 早期採用者計劃,並對計劃中的線元素增強功能提供回饋,這將提供另一種方法來實現此目的。
回覆:如何製作開始/停止長條圖?吉姆,是的,我看到了這一點,這是一個很好的解決方法。就我而言,有些長條圖會很長,我們希望經常放大時間軸,這意味著我必須在長條圖上間隔地繪製一大堆點。我還嘗試讓那些不太熟悉 JMP 的人使用這個繪圖儀,因此強迫他們選擇一個條形端點需要培訓並會增加流程摩擦。
回覆:如何製作起始/終止長條圖?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" ) ) ),
);