JMP 17.2.0
編輯:範例資料檔隨主帖一起上傳。
我在嘗試透過圖形產生器或 JSL(或組合)自訂圖形時遇到了一個小問題。我瀏覽了 JMP 論壇並發現了一些類似的主題,但沒有找到真正適合我具體想要做的事情的解決方案。
我希望 JMP 做的是:根據測試編號(或代碼中的 RUN_NUM)對我的標記進行顏色編碼,根據測試編號選擇不同的標記形狀,然後為每個測試編號繪製一條二次擬合線,其中線的顏色與每個測試編號的標記顏色相匹配,並且擬合線對於每個測試編號也始終是虛線。這裡要注意的另一件事是,我不想使用行顏色狀態之類的功能永久地為特定測試分配顏色。我希望無論我繪製哪些測試數字,圖表都使用相同的配色方案,因為這些數據是不斷增長的數據表的一部分,最終可能會有 100-200 個測試。例如,如果我繪製測試 1-5,我希望它們始終以藍色、紅色、綠色、橙色、紫色等配色方案繪製,這樣如果我改變繪製的內容,例如現在測試 1-4 + 測試 7,繪製的五個測試的配色方案是相同的。
我幾乎可以獲得上述所有功能,但卻無法獲得匹配的標記顏色編碼和擬合線。以下是我在圖形產生器/JSL 中迄今為止的流程:
- 我以 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)} )
);
})));
我能夠使用上述程式碼來修改擬合線屬性。然而,我發現了一些怪癖。
- 如上所述,上述程式碼將每條擬合線的線條樣式修改為虛線
- 如上所述,上述程式碼修改了每條擬合線的線寬
- 由於某種原因,所有擬合線都變成黑色
除了線條是黑色的以外,它幾乎滿足了我的所有要求。下一個怪癖:
- 如果我從 GB 中的“顏色”屬性中刪除“測試編號”,那麼我的所有擬合線現在都會與標記的顏色相匹配,並且它們會隨著每個選定的測試而動態變化!它們也都是虛線且寬度正確。
- 現在我的標記都是圓形的,而不是獨特的形狀,在選擇不同的測試時會發生變化,並且它們會忽略我在程式碼中指定的標記大小。
所以現在除了標記形狀之外我已經得到了所有內容。這就是我陷入困境的地方。看來我必須要接受以下兩種結果之一:
- 我想要的除了擬合線之外的一切都是黑線
- 我想要的(除了標記形狀)都是圓形(而且很小)

有人知道如何實現自訂圖表的所有功能嗎?也許我誤解了什麼?非常感謝您的幫忙。
之前的一些相關 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 中唯一需要處理的就是線條樣式 + 標記大小以及可能的圖例。
謝謝您的回覆!基於我對行狀態的有限理解,我認為我並不太想使用它們。行狀態對於這個非常小的資料集運作良好,但我的實際資料集涉及一百多個測試。如果我使用行狀態來分配顏色,那麼顏色最終將以略微不同的色調重複,因此我將進行紅色色調#1,紅色色調#2,紅色色調#3等測試。我更希望顏色方案與圖表相關,這樣無論我繪製哪個測試子集,顏色方案總是相同的,即,相同的測試將是紅色陰影#1,紅色陰影#2,紅色陰影#3等,行狀態將是藍色,紅色,綠色等,顏色方案與圖表相關。我上面只提到了顏色,但我相信標記形狀也會是同樣的情況,即行狀態標記形狀最終可能會在大型資料集中重複出現,因此會有一組測試都具有相同的標記形狀。
對於顏色,您有更多選擇,並且比標記更容易管理。目前,您只能為 Overlay 設定一列,因此您很可能必須依賴篩選器變更處理程序來使所有樣式以您想要的方式運作。預設情況下你會得到像這樣的圖

然後,您可以使用過濾器更改處理程序來保持標記尺寸更高並且線條樣式保持為線條。像這樣的 JMP 有時會出錯,並且忘記它應該添加顏色
</CODE></PRE>
<P>我想你也可以嘗試處理被稱為傳奇的噩夢,但是......如果可能的話我會避免它。這是 Graph Builder 中您可以嘗試操縱的最糟糕的事情之一(或可能是最糟糕的事情)。</P></LINGO-BODY><LINGO-SUB id="lingo-sub-849266" slang="en-US" mode="CREATE">回覆:強制 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 工具列。
此外掛程式可讓您完全控制 GraphBuilder 圖的顏色和標記設定。
您可以將設定同步套用於圖的所有元素 - 或將不同的設定套用到不同的元素。 (不透明度降低的標記 - 不透明度為 100 的線條)。
此設定將應用於所選項目。如果啟用“循環”,則應用設定後選擇將立即變更為下一個項目。如果未選擇任何項目,則設定將套用於所有項目: