如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?在下面的脚本生成的图表中,我想将红色箭头(“分隔线”)指示的线条的颜色更改为紫色。 另外,我想仅为最低的 y 轴变量(在本例中为 PNP1)添加水平参考线。
如何通过 JSL 执行这些操作?
(请注意,在我的实际情况中,y 轴数据不是来自与本示例情况不同的列)
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
Graph Builder(
Size( 960, 695 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch(
{},
"SITE",
ScaleBox,
{Label Row( 3, {Major Grid Line Color( 8 ), Show Major Grid( 1 )} )}
)
)
);
自动化和脚本编写视窗回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?通过颜色链接垂直线和轴标签是个好主意:)
不幸的是,线条太细,很难注意到该功能。
如果你也有同样的感觉,请支持这个愿望:
针对分层 X 类别的优化图形设置 - 2 个选项

或者,您可以将该站点用作 X 组 - 但很可能您会遇到同步 X 轴标签的问题。
还有一个希望解决这个问题:
X组:将轴上的值限制到相应的组
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt << Graph Builder(
Size( 841, 485 ),
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis Title( 0 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch( {}, "SITE", ScaleBox,
{Label Row(
1,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
2,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
3,
{Line Color( "Purple" ), Lower Frame( 1 ), Major Grid Line Color( "Purple" ),
Row Title Side( "Start" ), Tick Mark Style( "Long Divider" )}
)}
),
Dispatch( {}, "PNP1", ScaleBox, {Add Ref Line( 300, "Solid", "Black", "", 5 )} ),
Dispatch( {}, "Graph Builder", FrameBox( 4 ), {Reference Line Order( 3 )} )
)
)
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?你是什么意思
@尼奥写道:(请注意,在我的实际情况中,y 轴数据不是来自与本示例情况不同的列)
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?@hogi
>> (请注意,在我的实际情况中,y 轴数据不是来自与本示例情况不同的列)
在我的实际情况中,y轴参数来自行参数的本地数据过滤器选择
(如果它来自一个列,我可以在参考线的规格中设置一个限制(不是我尝试过这个,但我希望它能工作))
让我看看是否可以为演示准备一个数据集(我会回来的:))。
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?你好@尼奥,
的代码@hogi发布将解决您在图形生成器中获取单个子图的参考线的问题,但不幸的是,查看树结构,我没有找到一种方法来发送仅更改 x- 的一行的命令轴。 在树结构中,整个 x 轴分组在单个 AxisBox(1) 元素中,它不会被分割和嵌套,即使它在图形生成器中以这种方式显示。 我在首选项中也找不到任何允许您修改嵌套轴线的内容。
您始终可以右键单击您想要的轴,然后添加参考线,然后转到图形生成器旁边的红色热按钮并将脚本保存到脚本窗口,您可以看到脚本是如何被修改的添加行。
希望这可以帮助!,
DS
编辑:提交请求以更改嵌套轴的颜色可能是值得的。 这应该是可行的,我想很多人都可以从中受益。
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?哪一行有问题?
目前,最低图中只有一条水平线。
如果您必须隐藏部分参考线,您可以利用每个子图都有自己的自定义设置这一事实,因此您可以添加一些矩形并将它们放在参考线前面。
【或者,您也可以直接使用自定义脚本添加线段。】

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt << Graph Builder(
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis Title( 0 ),
Variables(
X( :SITE ),
X( :lot_id, Position( 1 ) ),
X( :wafer, Position( 1 ) ),
Y( :NPN1 ),
Y( :NPN2 ),
Y( :PNP3 ),
Y( :PNP1 )
),
Elements( Position( 1, 1 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 44 ) ) ),
Elements( Position( 1, 2 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 43 ) ) ),
Elements( Position( 1, 3 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 38 ) ) ),
Elements( Position( 1, 4 ), Points( X( 1 ), X( 2 ), X( 3 ), Y, Legend( 40 ) ) ),
SendToReport(
Dispatch( {}, "SITE", ScaleBox,
{Add Ref Line( 714.422378299564, "Solid", "Red", "", 4 ),
Label Row(
1,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
2,
{Lower Frame( 1 ), Row Title Side( "Start" ), Show Major Grid( 0 ),
Tick Mark Style( "Long Divider" )}
), Label Row(
3,
{Line Color( "Purple" ), Line Width( 3 ), Lower Frame( 1 ),
Major Grid Line Color( "Purple" ), Row Title Side( "Start" ),
Tick Mark Style( "Long Divider" )}
)}
),
Dispatch( {}, "PNP3", ScaleBox, {Add Ref Line( 135, "Solid", "Red", "", 3 )} ),
Dispatch( {}, "PNP1", ScaleBox, {Add Ref Line( 300, "Solid", "Black", "", 5 )} ),
Dispatch( {}, "400", ScaleBox,
{Legend Model( 38, Properties( 0, {Transparency( 0.5 )}, Item ID( "PNP3", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox,
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( -10000, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 2 ),
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( -10000, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 3 ),
{Grid Line Order( 2 ), Reference Line Order( 1 ),
Add Graphics Script(
2,
Description( "" ),
Fill Color( white );
Rect( 290, 10000, 10000, -10000, 1 );
)}
),
Dispatch( {}, "Graph Builder", FrameBox( 4 ), {Reference Line Order( 3 )} )
)
)
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?@hogi @SDF1附件是一个与我的实际数据类似的煮熟的数据表(内部有绘图脚本)。 我希望仅当在本地数据过滤器中选择测试阶段 3 时才会出现参考线(下图红色)。
(参考线 y 位置是预定义的)

回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?@SDF1

这会为所有子图添加参考线,这不是我想要的。
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?这是一个简单的情况,由于 Y 组,图形被分成不同的框架框。 然后您可以通过自定义添加单独的参考线。

Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox( 3 ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Pen Size( 3 );
Y Function( 0.4, x );
)}
)
)
)回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?你好@尼奥,
我会做@hogi建议并在右键单击感兴趣的图形时使用“自定义”选项,单击“+”将新脚本添加到 GB,然后输入 JSL 以添加行。



现在,要动态响应本地数据过滤器,我认为会更具挑战性。 如果您需要这种功能,我会生成自己的报告窗口,其中内置了图形生成器,然后可能使用复选框为用户提供在选择不同 TestStage 复选框时使用参考线更新子图的选项。
我确实也找到了一种改变嵌套线条颜色的方法。 我不知道这是否是“正确”的方法,或者即使它是最快的方法,但是如果您右键单击嵌套轴然后选择显示属性,如果您单击嵌套轴然后单击单击 AxisBox 旁边的红色热按钮,选择复制轴设置,然后可以将其粘贴到脚本窗口中并进行编辑。 选择感兴趣的轴,然后将线条颜色从“无”更改为您想要的任何颜色。 然后,您必须复制此编辑过的代码,返回红色热按钮,选择粘贴轴设置,它将更新图形。 这将完成工作,但我不确定如何动态地完成这项工作。



将相应的脚本保存到脚本窗口中,您可以看到发送图形生成器和标签行所需的命令,以获得您想要的结果。
Graph Builder(
Size( 592, 526 ),
Y Group Edge( "Left" ),
Graph Spacing( 4 ),
Variables(
X( :TestStage ),
X( :TestParameter, Position( 1 ) ),
Y( :Median ),
Group Y( :TestStage )
),
Elements(
Points( X( 1 ), X( 2 ), Y, Legend( 33 ) ),
Smoother( X( 1 ), X( 2 ), Y, Legend( 34 ) )
),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == {1, 2, 3} ) )
),
SendToReport(
Dispatch(
{},
"TestStage",
ScaleBox,
{Label Row( 2, Line Color( "Purple" ) )}
),
Dispatch(
{},
"Graph Builder",
FrameBox( 3 ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Pen Size( 3 );
Y Function( 0.3, x );
)}
)
)
);使用这些信息并使用 Semiconductor Capability.jmp 文件返回到您的原始帖子,您可以实现您最初的要求,嵌套轴是紫色的,垂直网格线是紫色的,并且有一条参考线仅用于最底部的图表。 在这种特殊情况下,双击要添加参考线的轴将起作用,因为您正在图形生成器的子图中绘制不同的列。 对于您共享的示例数据表,您必须使用“自定义”以另一种方式进行操作,并添加 Y Function()。

下面是生成上图的 JSL 代码。 您可以查看需要在哪里针对您的具体情况进行适当的编辑。
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
dt<<GRAPH builder=""></GRAPH>
希望这可以帮助!,
DS
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?您可以根据值本身计算平均值:
Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) )
);
myFB = Current Report()[FrameBox( 3 )];
myFB << Add Graphics Script(
2,
Description( "" ),
<STRONG> mySeg = myFB << Find Seg( Marker Seg( 1 ) );
value = Mean( mySeg << Get Y Values );</STRONG>
Pen Color( "red" );
Pen Size( 3 );
Y Function( value, x );
);
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?@SDF1谢谢。 我将检查您如何设法将嵌套轴的颜色更改为紫色。 同时我用了@hogi建议和 Make Filter Change Handler () 在用户更改过滤器选择时动态更改 JMP 放置参考线的位置。 我还没有解决这两个问题。
1. 第一次绘制图表时,过滤器更改处理程序不会触发,而是仅在选择下一个 TestStage 时触发。
2. 更换过滤器后,较早的参考线仍保留在不同的测试阶段,我明白原因,但还无法将其删除。
Names Default To Here (1);
clear log ();
gb = Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == {1} ) )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
getTestStage = Function( {this}, //print (this);
testStateFiltered = Associative Array(:TestStage [ldf << get filtered rows]) << get keys;
gb << SendToReport(
Dispatch({},"Graph Builder",
FrameBox(N Items (testStateFiltered)), {Add Graphics Script( 2, Description( "" ), Pen Color( "red" ); Line Style ("dashed"); Pen Size( 0.25 );
Y Function( 0.2, x );
)}
)
);
show (N Items (testStateFiltered)); Print(testStateFiltered);
);
rs = ldf << Make Filter Change Handler( getTestStage() ); 回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?顺便说一句 - Jmp17 中有一个新功能:
根据统计值添加动态参考线
Graph Builder(
Y Group Edge( "Left" ),
Summary Statistic( "Median" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements(
Points( X, Y, Legend( 33 ) ),
Smoother( X, Y, Legend( 34 ) ),
Caption Box(
X,
Y,
<STRONG> Summary Statistic( "Median" ),
Location( "Axis Reference Line" )</STRONG>
)
),
Local Data Filter(
Conditional,
Add Filter( columns( :TestStage ), Where( :TestStage == 1 ) )
)
)
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?你好@尼奥,
这是一个非常酷的想法@hogi关于使用过滤器更改处理程序。 我没想到这一点。 我修改了您的上述代码来解决您遇到的两个问题。 该脚本现在将使用参考线创建第一个图表,然后相应地更新每个图表,即使选择多个数据过滤器也是如此。 这能解决问题吗?
Names Default To Here( 1 );
dt = Current Data Table();
//this creates a string list of the column names
ColNamesList = dt << Get Column Names( "string" );
//This tests if the there exist a :Mean Column. If not, it runs a summary to generate this data, updates the main table with the means and then deletes a column and closes out the summary table.
If( Contains( ColNamesList, "Mean" ) == 0,
dtMeans = dt << Summary(
Group( :TestParameter ),
Mean( :Median ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "stat" ),
Link to original data table( 0 ),
output table name( "MeanStats" )
);
dt << Update( With( dtMeans ), Match Columns( :TestParameter = :TestParameter ) );
dt << Delete Columns( :N Rows );
Close( dtMeans, NoSave );
);
//this makes the original graph with the reference line of the first row in column :Mean
gb = dt << Graph Builder(
Y Group Edge( "Left" ),
Variables( X( :PartNumber ), Y( :Median ), Group Y( :TestStage ) ),
Elements( Points( X, Y, Legend( 33 ) ), Smoother( X, Y, Legend( 34 ) ) ),
Dispatch(
{},
"Graph Builder",
FrameBox( N Items( testStateFiltered ) ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Line Style( "dashed" );
Pen Size( 0.25 );
Y Function( Eval( :Mean[1] ), x );
)}
),
Local Data Filter( Conditional, Add Filter( columns( :TestStage ), Where( :TestStage == 1 ) ) )//no {} around the 1 here.
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
getTestStage = Function( {this}, //print (this);
testStateFiltered = Associative Array( :TestStage[ldf << get filtered rows] ) << get keys;
//this finds which row to grab the mean from
mrows = dt << Get Rows where( :TestStage == testStateFiltered[1] );
//this defines the mean to Eval() in the Y Function()
gbmean = :Mean[mrows[1]];
If( N Items( testStateFiltered ) == 1, //only does this if only one data filter is selected
gbreport = gb << Report; //makes a report reference for the graph builder
fb = gbreport[GraphBuilderComponentBox( 17 )];//accesses the frame to remove the script from
fb << Remove Graphics Script( 1 );//removes most recent script from the frame
);
gb << SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox( N Items( testStateFiltered ) ),
{Add Graphics Script(
2,
Description( "" ),
Pen Color( "red" );
Line Style( "dashed" );
Pen Size( 0.25 );
Y Function( Eval( GBMean ), x );
)}
)
);
Show( N Items( testStateFiltered ) );
Print( testStateFiltered );
);
rs = ldf << Make Filter Change Handler( getTestStage() );
希望这可以帮助!,
DS
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?第一次,你可以运行获取测试阶段(1)手动。
请注意,使用数据过滤器时,GraphBuilder 中有 1-3 个 FrameBox(大多数时候,只有 1 个?)。 因此,要么您确定将消息发送到哪个 FB,要么只选择一个 TestStage 并始终将命令发送到 Framebox 1。
回复:如何 (1) 更改 AxisBox 中的默认颜色和 (2) 在分组 Y 图中仅在一个 Y 轴变量中添加参考线?@SDF1 @hogi
我分享的数据表是一个快速拼凑起来的例子。 我应该提到,我不能使用 LSL/USL 或此表中的任何其他数字来生成参考线。
无论如何,以下内容对我有用。
- 呼唤getTestStage(1) 在 Make Filter Change Handler 调用之前。
- 在 getTestStage 函数内添加带有适当句柄的RemoveGraphicsScript (N),其中 N 是从更改 TestStage 过滤器时生成的最后选定的 TestStage 框架框编号获得的框架框编号。
我现在就解决这个问题。 然而,还存在一个问题。 如果选择一个 TestStage,然后选择第二个,然后第三个,一切都会按预期工作,但如果我从 3 个选择返回到一个,我的脚本将无法按预期工作。
当我有机会时,我将发布具有代表性的数据集以及解释问题的脚本。