17.2.0 リリース
編集: サンプル データ ファイルがメイン投稿とともにアップロードされました。
グラフ ビルダーまたは JSL (またはコンボ) を介してグラフをカスタマイズしようとしたときに、ちょっとした問題が発生しました。JMP フォーラムを調べて、類似のトピックをいくつか見つけましたが、私が具体的にやりたいことに対して実際に機能する解決策はありませんでした。
JMP で実行したいのは、マーカーをテスト番号 (またはコードでは RUN_NUM) 別に色分けし、テスト番号ごとに異なるマーカーの形状を選択し、各テスト番号の 2 次近似線をプロットすることです。この線の色は各テスト番号のマーカーの色と一致し、近似線もすべてのテスト番号で常に破線になります。ここで注意すべきもう 1 つの点は、行の色の状態などの機能を使用して特定のテストに色を永続的に割り当てたくないということです。このデータは、最終的に 100 ~ 200 のテストになる可能性のある成長中のデータ テーブルの一部であるため、プロットするテスト番号に関係なく、グラフで同じ配色を使用するようにします。たとえば、テスト 1 ~ 5 をプロットする場合、青、赤、緑、オレンジ、紫などの配色で常にプロットするようにします。そうすれば、プロット対象を変更しても (たとえば、テスト 1 ~ 4 + テスト 7)、プロットされた 5 つのテストの配色は同じになります。
上記の機能はほぼすべて実現できましたが、マーカーと適合ラインの色分けを一致させるのがまだ不十分です。グラフ ビルダー/JSL でのこれまでのプロセスは次のとおりです。
- データ ポイントを GB 単位でプロットします。通常、テストごとに 4 つのデータ ポイントがあります。
- 「テスト番号」を 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)} )
);
})));
上記のコードを使用して、フィットラインのプロパティを変更することができます。ただし、いくつか問題点が見つかりました。
- 上記のコードは、フィットするすべての線の線種を破線に変更します。
- 上記のコードは、フィットするすべてのラインの線幅を変更します。
- 現状では、何らかの理由でフィットラインはすべて黒色になっています
線が黒いこと以外は、ほぼ希望どおりです。次の奇妙な点:
- GB の「色」プロパティから「テスト番号」を削除すると、すべての適合線がマーカーの色と一致し、選択したテストごとに動的に変化します。また、すべて破線で正しい幅になります。
- 現在、マーカーはすべて円になっており、異なるテストを選択すると形状が変わる固有の形状ではなく、コード内で指定したマーカー サイズは無視されます。
これで、マーカーの形状以外はすべて取得できました。ここで行き詰まっています。次の 2 つの結果のうちの 1 つを受け入れなければならないようです。
- フィットライン以外、私が望むものはすべて常に黒い線です
- マーカーの形状を除いて、私が望むものはすべて常に円形(そして小さい)です

カスタム グラフで私が望むことをすべて実現する方法を知っている人はいませんか? 何か誤解していることがあるのでしょうか? どのような助言でも大歓迎です。
以前の関連する 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/assign-marker-style-line-style-by-quot-string-quot-or-specific/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 を超えるテストが含まれます。行状態を使用して色を割り当てると、色は最終的にわずかに異なる色合いで繰り返されるため、Red Shade #1、Red Shade #2、Red Shade #3 などのテストが作成されます。その後、これらの特定のテストのプロットが必要になった場合、それらはすべてわずかに異なる赤になり、色に基づいて区別するのが非常に難しくなります。色のスキームがプロットに関連付けられている方が、どのテストのサブセットをプロットしても色のスキームが常に同じになります。つまり、行状態が Red Shade #1、Red Shade #2、Red Shade #3 などの同じテストは、プロットに関連付けられた色のスキームでは青、赤、緑などになります。上記では色についてのみ言及しましたが、マーカーの形状についても同じシナリオになると思います。つまり、行状態マーカーの形状は最終的に大規模なデータ セットで繰り返される可能性があるため、すべて同じマーカーの形状を持つテストのサブセットが存在することになります。
色にはより多くのオプションがあり、マーカーよりも管理が簡単です。現在、オーバーレイには1つの列しか設定できないため、すべてのスタイルを希望どおりに動作させるには、フィルター変更ハンドラーに頼らざるを得ないでしょう。デフォルトでは、次のようなプロットが表示されます。

フィルター変更ハンドラーを使用して、マーカーのサイズを大きくし、線のスタイルを線のままにすることができます。このような場合、JMPは時々混乱し、色を追加することを忘れてしまいます。
</CODE></PRE>
<P>Legend と呼ばれる悪夢に対処することもできると思いますが、可能であれば避けたほうがよいでしょう。これは、Graph Builder で操作しようとすると最悪 (あるいは最悪) なものの 1 つです。</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 マーケットプレイスのGraphBuilder ツールバーを検討してください。
このアドインを使用すると、GraphBuilder プロットの色とマーカーの設定を完全に制御できます。
設定をプロットのすべての要素に同期して適用することも、異なる要素に異なる設定を適用することもできます。(不透明度を下げたマーカー - 不透明度 100 の線)
設定は選択した項目に適用されます。「サイクル」が有効になっている場合、設定を適用するとすぐに選択が次の項目に変わります。項目が選択されていない場合、設定はすべての項目に適用されます。