17.2.0 버전
편집: 메인 게시물에 예제 데이터 파일이 업로드되었습니다.
그래프 빌더나 JSL(또는 콤보)을 통해 그래프를 사용자 지정하려고 할 때 약간의 문제가 발생했습니다. JMP 포럼을 뒤져 비슷한 주제를 찾았지만, 제가 구체적으로 하려는 일에 실제로 효과가 있는 솔루션은 없었습니다.
JMP에서 제가 원하는 것은: 테스트 번호(또는 코드에서는 RUN_NUM)로 마커에 색상 코드를 지정하고, 테스트 번호별로 다른 마커 모양을 선택한 다음, 각 테스트 번호에 대한 2차 적합선을 그리는 것입니다. 여기서 선의 색상은 각 테스트 번호의 마커 색상과 일치하고 적합선은 항상 모든 테스트 번호에 대해 점선입니다. 여기서 주의해야 할 또 다른 사항은 행 색상 상태와 같은 기능을 사용하여 특정 테스트에 영구적으로 색상을 지정하고 싶지 않다는 것입니다. 이 데이터는 100-200개의 테스트로 끝날 수 있는 증가하는 데이터 테이블의 일부이므로 어떤 테스트 번호를 그리든 그래프가 동일한 색상 구성표를 사용하기를 원합니다. 예를 들어, 테스트 1-5를 그리는 경우 항상 파란색, 빨간색, 초록색, 주황색, 보라색과 같은 색상 구성표로 그리도록 하여, 이제 테스트 1-4 + 테스트 7과 같이 그리는 것을 변경하더라도 그려진 5개의 테스트에 대한 색상 구성표가 동일하도록 합니다.
위의 모든 기능을 거의 얻을 수 있지만 마커의 색상 코딩과 적합선을 일치시키는 데는 부족합니다. 지금까지 그래프 빌더/JSL에서 진행한 프로세스는 다음과 같습니다.
- 저는 일반적으로 테스트당 4개의 데이터 포인트를 GB 단위로 표시합니다.
- '테스트 번호'를 GB의 '오버레이' 공간으로 끌어다 놓습니다. 이 색상은 테스트당 데이터 포인트에 적용됩니다.
- '테스트 번호'를 GB의 '색상' 공간으로 드래그합니다. 이렇게 하면 각 테스트에 대한 모양이 선택됩니다.
- 그래프에 선을 추가하는 적합선 옵션을 클릭했지만 선 스타일이 다르고 색상은 항상 JMP 기본값인 파란색입니다.
따라서 위의 단계를 사용하면 가까이 가지만 아직은 거기에 도달하지 못했습니다. JMP 포럼을 사용하여 JSL을 추가하여 선 스타일 및/또는 색상을 수정하는 좋은 방법을 찾았지만 둘 다 함께는 할 수 없습니다. GB 그래프를 저장한 다음 JSL을 약간 편집하여 둘 중 하나를 얻을 수 있습니다.
참고: 아래 코드에서 테스트 번호 = RUN_NUM
그래프 코드의 맨 위에 이것을 추가하면:
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
그래프 코드의 맨 아래에 이것을 추가합니다.
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
})));
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
})));
위의 코드를 사용하여 맞춤 속성의 라인을 수정할 수 있습니다. 하지만 몇 가지 이상한 점을 발견했습니다.
- 그대로, 위의 코드는 모든 맞춤 라인에 대해 라인 스타일을 파선으로 수정합니다.
- 그대로라면 위의 코드는 fit의 모든 줄에 대한 줄 너비를 수정합니다.
- 현재 모든 적합선은 어떤 이유에서인지 검은색으로 표시됩니다.
선이 검은색인 것을 제외하면 내가 원하는 모든 것이 거의 다 있습니다. 다음 엉뚱한 점:
- GB의 "color" 속성에서 "test number"를 제거하면 모든 적합 선이 이제 마커의 색상과 일치하고 선택한 각 테스트에 따라 동적으로 변경됩니다! 또한 모두 점선이고 올바른 너비입니다.
- 이제 내 마커는 다른 테스트를 선택할 때마다 바뀌는 고유한 모양 대신 모두 원형이며, 코드에서 지정한 마커 크기는 무시됩니다.
그래서 이제 마커 모양을 제외한 모든 것을 얻었습니다. 여기가 제가 막힌 곳입니다. 두 가지 결과 중 하나를 받아들여야 할 것 같습니다.
- 내가 원하는 모든 것은 맞는 선을 제외하고는 항상 검은색 선입니다.
- 내가 원하는 모든 것은 마커 모양을 제외하고는 항상 원형(그리고 작음)입니다.

사용자 정의 그래프에 대해 내가 원하는 모든 것을 달성할 수 있는 방법을 아는 사람이 있나요? 내가 오해하고 있는 것이 있는 걸까요? 도움을 주시면 정말 감사하겠습니다.
이전에 관련된 JMP 토론:
- https://community.jmp.com/t5/Discussions/Match-Line-Color-of-Normal-Quantile-Plot-to-Row-Color-Set-in-Row/mp/124080
- https://community.jmp.com/t5/Discussions/Change-color-theme-in-plot-legend-of-FIt-Curve/td-p/368792
- https://community.jmp.com/t5/Discussions/sign-marker-style-line-style-by-quot-string-quot-or-spec/td-p/48860
전체 GB 코드:
dt = Data Table( "DT" );
//this short section makes a list of all runs/tests in the data table
//then all the runs are counted in a later section for a "for loop"
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
//below is the graph builder code
gb = Graph Builder(
Size( 850, 600 ),
Show Legend( 1 ),
Show Title( 0 ),
Show Footer( 0 ),
Fit to Window( "Off" ),
Variables(
X( :TEMP ),
Y( :CONVERSION ),
Overlay( :RUN_NUM ),
Color( :RUN_NUM )
),
Elements(
Points( X, Y, Legend( 1 ) ),
Line Of Fit(
X,
Y,
Legend( 2 ),
Degree( "Quadratic" ),
Confidence of Fit( 0 )
)
),
SendToReport(
Dispatch( {"Line Of Fit"}, "", OutlineBox, {Close( 0 )} ),
Dispatch(
{},
"TEMP",
ScaleBox,
{Min( 50 ), Max( 100 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Show Major Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )
}
)}
),
Dispatch(
{},
"CONVERSION",
ScaleBox,
{Min( 40 ), Max( 60 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Automatic Font Size( 0 ), Show Major Grid( 1 ),
Show Minor Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )}
)}
),
Dispatch(
{},
"X title",
TextEditBox,
{Set Text( "Temperature" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
Dispatch(
{},
"Y title",
TextEditBox,
{Set Text( "Conversion" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
)
);
//this loop goes through all runs and changes lines to dashed and changes their width
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
}
)
)
);
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
}
)
)
);
따라서 특정 테스트 실행에 대해 항상 특정 마커를 제공하고 각 실행이 순서에 따라 "기본" 색상을 갖도록 동적으로 구축되는 그래프 빌더를 빌드하고 싶으신가요?

가능하다면 마커에 행 상태를 사용할 것이고 그러면 JSL에서 처리해야 할 유일한 것은 선 스타일 + 마커 크기, 그리고 가능하면 범례뿐일 것입니다.
답변 감사합니다! 행 상태에 대한 제 이해가 부족해서 사용하고 싶지는 않습니다. 행 상태는 이 매우 작은 데이터 집합에는 잘 작동하지만 실제 데이터 집합에는 100개가 넘는 테스트가 포함됩니다. 행 상태를 사용하여 색상을 지정하면 색상이 결국 약간 다른 음영으로 반복되므로 빨간색 음영 #1, 빨간색 음영 #2, 빨간색 음영 #3 등의 테스트가 생깁니다. 그런 다음 해당 테스트의 플롯이 필요한 경우 모두 약간 다른 빨간색이 되어 색상에 따라 구분하기가 매우 어려울 것입니다. 색상 구성표가 플롯에 연결되어 어떤 테스트 하위 집합을 플롯하든 색상 구성표가 항상 동일하면 좋겠습니다. 즉, 행 상태가 있는 빨간색 음영 #1, 빨간색 음영 #2, 빨간색 음영 #3 등의 동일한 테스트는 색상 구성표가 플롯에 연결된 경우 파란색, 빨간색, 녹색 등이 됩니다. 위에서는 색상만 언급했지만, 마커 모양에도 같은 시나리오가 적용될 수 있다고 생각합니다. 즉, 행 상태 마커 모양은 결국 대규모 데이터 세트에서 반복될 수 있으므로 모두 동일한 마커 모양을 갖는 테스트 하위 집합이 있을 것입니다.
색상의 경우 마커보다 더 많은 옵션이 있으며 관리하기 쉽습니다. 현재 오버레이에 대해 열이 하나만 있을 수 있으므로 모든 스타일이 원하는 대로 작동하도록 하려면 필터 변경 핸들러에 의존해야 할 가능성이 큽니다. 기본적으로 이와 같은 플롯을 얻게 됩니다.

그런 다음 필터 변경 핸들러를 사용하여 마커 크기를 더 높게 유지하고 선 스타일을 선으로 유지할 수 있습니다. 이런 식으로 JMP는 때때로 엉망이 되어 색상을 추가해야 한다는 것을 잊어버립니다.
</CODE></PRE>
<P>Legend라는 악몽을 다루는 것도 시도해 볼 수 있을 것 같지만... 가능하다면 피하는 게 좋습니다. Graph Builder에서 조작할 수 있는 최악의(혹은 아마도 최악의) 것 중 하나입니다.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-849266" slang="en-US" mode="CREATE">Re: 강제 선 스타일과 함께 마커 색상에 맞는 선 색상을 맞추도록 JMP에 명령</LINGO-SUB><LINGO-BODY id="lingo-body-849266" slang="en-US" mode="CREATE"><P>마커 크기는 마우스 오른쪽 클릭 메뉴에서 제어할 수 있으며 프레임 상자를 위한 컨트롤입니다.</P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/74118i18BC8FCF0D2275C2/jthi_0-1742669047885.png" role="button" title="jthi_0-1742669047885.png" alt="jthi_0-1742669047885.png" /></span></SPAN></SPAN></SPAN></SPAN></P>
<P>하지만 라인에 대해서는 비슷한 것을 찾을 수 없었습니다... 그래서 이런 것이 작동할 수도 있을 겁니다.</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(Points(X, Y, Legend(5)), Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))),
Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7)))),
SendToReport(Dispatch({}, "Graph Builder", FrameBox, {Marker Size(6), Marker Drawing Mode("Normal")}))
);
l_expr = Expr(Legend Model(7));
Summarize(dt, c = By(:RUN_NUM));
For Each({item}, c,
cur_expr = EvalExpr(Properties(0, {Line Style("Dashed")}, Item ID(Expr(item), 1)));
Insert Into(l_expr, Name Expr(cur_expr));
);
d_expr = EvalExpr(
Dispatch({}, "400", ScaleBox,
{Expr(Name Expr(l_expr))}
)
);
Eval(EvalExpr(Send(gb, Expr(Name Expr(d_expr)))));Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(
Points(X, Y, Legend(5)),
Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))
)
);
ldf = gb << Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7))));
Eval(EvalExpr(
f = Function({a},
gb_rep = Expr(Report(gb));
gb << inval;
fb = gb_rep[FrameBox(1)];
segs = fb << Find Segs;
For Each({seg}, segs,
Match(seg << class name,
"MarkerSeg", seg << Set Marker Size(10),
"LineSeg", seg << Set Line Style("Dashed")
);
);
);
));
rs = ldf << Make Filter Change Handler(f);
f(1); // to initialize at least once
GUI를 통해 대화형으로 설정을 적용하는 것이 괜찮다면 JMP Marketplace의 GraphBuilder Toolbar를 살펴보세요.
이 추가 기능을 사용하면 GraphBuilder 플롯의 색상 및 마커 설정을 완벽하게 제어할 수 있습니다.
플롯의 모든 요소에 동기적으로 설정을 적용할 수도 있고, 다른 요소에 다른 설정을 적용할 수도 있습니다. (불투명도가 낮은 마커 - 불투명도가 100인 선).
설정은 선택한 항목에 적용됩니다. "cycle"이 활성화된 경우 설정을 적용한 직후 선택이 다음 항목으로 변경됩니다. 항목을 선택하지 않으면 설정이 모든 항목에 적용됩니다.