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)} )
);
}
)
)
);
我将尝试清理一些数据,以便今天晚些时候可以发布一个示例 JMP 文件。
拖延了很久,但我已经编辑了主帖并上传了包含图表和一些数据的数据文件。
所以您希望能够构建以这样一种方式动态构建的图形生成器,即您始终为特定的测试运行设置特定的标记,并且每次运行都应该根据顺序具有“基本”着色?

如果可能的话,我很可能会使用行状态作为标记,然后您在 JSL 中唯一需要处理的就是线条样式 + 标记大小以及可能的图例。
谢谢回复!基于我对行状态的有限理解,我认为我不太想使用它们。行状态对于这个非常小的数据集来说效果很好,但我的实际数据集涉及一百多个测试。如果我使用行状态来分配颜色,那么颜色最终会以略有不同的色调重复,所以我将有红色阴影 #1、红色阴影 #2、红色阴影 #3 等测试。然后,如果我碰巧需要这些特定测试的图表,它们都会是略有不同的红色,并且很难根据颜色区分它们。我更希望配色方案与图表相关联,这样无论我绘制哪个测试子集,配色方案始终相同,即,相同的测试将是红色阴影 #1、红色阴影 #2、红色阴影 #3 等,行状态将是蓝色、红色、绿色等,配色方案与图表相关联。我上面只提到了颜色,但我相信标记形状也会是同样的情况,即行状态标记形状最终可能会在大型数据集中重复出现,因此会有一组测试都具有相同的标记形状。
对于颜色,您有更多选择,而且比标记更容易管理。目前,您只能为 Overlay 设置一列,因此您很可能必须依赖过滤器更改处理程序来保持所有样式按您想要的方式工作。默认情况下,您将获得如下图所示的图表

然后,您可以使用过滤器更改处理程序来保持标记大小更高,线条样式为线条。使用类似这样的程序,JMP 有时会出错,忘记它应该添加颜色
</CODE></PRE>
<P>我认为你也可以尝试处理名为 Legend 的噩梦,但是...如果可能的话,我会避免它。它是 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 的线条)。
该设置将应用于所选项目。如果启用“循环”,则应用设置后选择将立即更改为下一个项目。如果未选择任何项目,则该设置将应用于所有项目:
感谢您提供有关此插件的信息。我会尝试一下,看看它是否适合我,然后汇报。