시작/종료 막대 차트는 어떻게 만드나요?다음과 같은 데이터가 있다고 가정해 보겠습니다.
| 단계 | 시작 | 멈추다 |
| 믹서 | 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을 사용한 간단한 설명은 다음과 같습니다. 하나의 마커만 사용하여 더 간단하게 만들 수 있지만 두 개가 있으면 사용자가 양쪽 끝에서 행을 "선택"할 수 있습니다.
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"를 제거하고 겹치는 직사각형을 두 개 그리면 어떨까요? 그러면 시작 또는 종료가 가장자리에 가깝거나 그래프 밖에 있어도 막대가 안정적으로 유지됩니다.
Re: 시작/종료 막대 차트를 어떻게 만드나요?기본적으로 이를 수행하는 방법은 무한합니다. 필요에 가장 적합한 방법을 선택하세요(또는 직접 만드세요). 평균 지점을 활용하면서 시작부터 끝까지 직사각형을 사용하면 시작/종료 마커를 쉽게 사용할 수 있고, 사용자가 클릭할 수 있도록 중앙에 추가 "마커"를 추가할 수 있습니다.

Re: 시작/종료 막대 차트를 어떻게 만드나요?대신에
Color Of(Row State(this row))
마커 그리기 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
그리고 그 Color는 그렇지 않습니다.
Re: 시작/종료 막대 차트를 어떻게 만드나요?JSL rect-drawing 접근법은 올바른 이미지를 만들어내고, JMP에서 어떻게 작동하는지 배우게 되어 기쁩니다. 더 많이 놀아봐야 할 것 같습니다.
하지만 우리가 잃은 것은 막대 안을 클릭하여 데이터 테이블에서 해당 행을 선택하는 기능입니다. 제 데이터 세트도 꽤 크고(수백만 개의 행) 로컬 필터로 이동하는 4번째 열로 키가 지정된 세트로 나뉩니다. 이렇게 하면 동일한 창에서 모든 결과 세트를 빠르게 볼 수 있습니다. 로컬 데이터 필터가 변경될 때마다 막대를 업데이트하도록 JSL을 코딩하는 것이 가능하다는 것을 알고 있지만, 복잡성이 한 단계 더 높아집니다.
"ID" 열이 오버레이로 사용될 때 여러 행을 하나로 축소할 수 있도록 "막대 오버랩" 설정을 수정/업데이트하기 위한 위시리스트 항목을 제출하려고 합니다.
전반적으로 인상적인 반응이었습니다! 응답해 주신 모든 분들께 감사드립니다!
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 Early Adopter 프로그램에 가입하여 이를 수행하는 또 다른 방법을 제공할 계획된 Line 요소 개선에 대한 피드백을 제공하세요.
Re: 시작/종료 막대 차트를 어떻게 만드나요?짐, 네, 이걸 봤는데, 훌륭한 해결책이에요. 제 경우에는 막대 중 일부가 매우 길고 타임라인에서 확대될 것으로 예상하는데, 이는 막대 아래로 간격을 두고 많은 점을 플로팅해야 한다는 뜻입니다. 또한 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" ) ) ),
);