事件线和控制图注释
用已知事件注释控制图? 我不断遇到需要向图表添加事件线的情况。 这些与阶段不同,因为我不需要重新计算平均值和控制限,我只需要一个标记来表明发生了某些事情。 在某些情况下,我需要以方便的自动化方式在图表上标记点。 该博客介绍了几个可以添加到控制图表图形中的脚本,这些脚本有助于绘制事件线并向图形添加注释。

自定义图表的第一步是在图表内部右键单击并选择“自定义”,然后将出现“自定义图表”对话框。 单击左上角的“+”图标将打开一个空白脚本,您可以在其中粘贴下面讨论的示例。第一个示例要求您的表中有一个名为“Comment”的字符列。 当此列中有一个值时,它将导致在图表上绘制一条垂直线,如上例所示。

第二步是查看可以添加到此窗口的几个自定义脚本。 每组指令或参数必须用分号连接在一起。 了解如何在图表中使用这些自定义脚本的一个好地方是对话框窗口中的“示例和模板”下拉列表。 此外,“帮助”选项卡下的“脚本索引”包含每个功能的详细信息。 请记住,这个小脚本窗口是有限的,因此在应用更改后,请考虑将报告脚本保存到脚本窗口以继续编辑。 添加到图表中的所有自定义脚本也将显示在报表对象脚本中。 通过此对话框可以轻松添加到图表,而无需了解太多 JSL 以及如何操作报表对象的脚本。
自定义图形脚本 1:添加线条
For Each Row( If( Is Missing( :Comment ) == 0, V Line( row() ) ) );
解释:
- For Each Row():这使得公式在每一行而不是列级别进行计算。
- Is Missing():如果该行为空,则该函数返回“0”,否则返回“1”。 如果该行未丢失(即 =“0”),则评估 V 线并绘制一条线。
- V Line():检查该脚本的索引,有很多有趣的选项可供使用。 在本例中,我只给它一个数字,因此它将在该数字处在整个框架上绘制一条垂直线。 (没有号码吧?)
- Row():该函数返回行号。 我使用这个行号作为穿过框架绘制垂直线的位置。
自定义图形脚本 2:向线条添加标签
For Each Row( If( Is Missing( :Comment ) == 0, Text( Right Justified, {row(),
Col Maximum( :Data ) * 1.2},:Comment)));
解释:
- For Each Row():这使得公式在每一行而不是列级别进行计算。
- If():这是一个经典的“If、Then、Else”函数。 如果条件为真,则执行第一件事,否则执行第二件事。 除了这里没有“其他”,所以如果条件为真,那么第一件事就会发生,否则什么也不会发生。
- Is Missing():如果该行为空,则该函数返回“0”;如果不是,则返回“1”。 在这里,如果该行丢失,则不会发生任何事情,但如果不丢失,则对文本函数进行求值。
- Text():再次检查脚本索引,了解可以包含在此处的所有参数,以及一些很好的示例。 这里我们要把文本放在坐标Y和X处,文本在:Comment栏中。
- Row() 是 x 位置,y 位置是 :Data 列的最大值 (Col Maximum()) 乘以 1.2。 这使得文本显示在数据点上方一点。
自定义图形脚本 3:向数据点添加标签。
仅使用列和行属性来标记数据点可能更好、更容易,但在某些情况下,像这样的脚本解决方案的复杂程度可以接受。
For Each Row(If( Is Missing( :Note ) == 0, If( :Data <= Col Mean( :Data ),
Text( Right Justified,{Row(),:Data-:Data*1.1}, :Note ),
Text( Right Justified,{Row(),:Data * 1.1}, :Note ))));
解释:
- 这有点花哨。 该表达式中有一个嵌套的 If 语句。 如果 Note 未缺失且 :Data 小于或等于 :Data 的列平均值,则使 :Note 中的文本位于数据点下方,否则使 :Note 中的文本位于数据点上方。
- 这种方式在图表中看起来更好,但在这个示例中,它开始看起来比需要的更复杂一些。
- 一个更简单的版本如下所示:
For Each Row(If( Is Missing( :Note ) == 0, Text( Right Justified,{Row()+1,:Data}, :Note );
“row()+1”将文本移动到数据点的右侧
控制图脚本示例
该脚本的表格需要具有以下列,附有示例表格。
- ID,连续行号
- 数据,包含趋势数据的列
- 注释,垂直线的稀疏注释列
- 注释,特定数据点的稀疏注释列
该脚本生成上图中的控制图。
Control Chart(
Sample Label( :ID ),
Group Size( 1 ),
KSigma( 3 ),
Chart Col( :Data, Individual Measurement ),
SendToReport(
Dispatch(
{"Individual Measurement of Data"},
"IR Chart of IM",
FrameBox,
{Frame Size( 800, 200 ), Add Graphics Script(
1,
Description( "Script" ),
For Each Row( If( Is Missing( :Comment ) == 0, V Line( Row() ) ) );
For Each Row(
If( Is Missing( :Comment ) == 0,
Text( Right Justified, {Row(), Col Maximum( :Data ) * 1.2},:Comment ))
);
For Each Row(
If( Is Missing( :Note ) == 0,
If( :Data <= Col Mean( :Data ),
Text( Right Justified,{Row(),:Data-:Data*1.1}, :Note ),
Text( Right Justified,{Row(),:Data * 1.1}, :Note )))
);
), Grid Line Order( 2 ), Reference Line Order( 3 )}
),
Dispatch( {"Individual Measurement of Data"}, "IR Chart of IM", FrameBox( 2 ),
{Frame Size( 72,200)})))
1. 是的,您会添加什么?
2.我确信有一种方法可以间接做到这一点。 我认为有一种方法可以查询哪些列用于制作报告,并以这种方式捕获列名称。 然后将自定义脚本附加到图表并引用数据列。
2. 如果我迭代变量列表,然后在自定义脚本中包含对当前列的引用,则会更容易。
嗨,拜伦,另一件事(实际上是 2!!),是否可以为“自定义图形脚本 3:向数据点添加标签”添加标签行。是否有一种脚本方法,您不必准确命名 y 轴(例如“:Data”),但它默认为列名称
干杯伊恩
伊恩,
我不确定是什么原因导致这种情况发生(还没有足够的咖啡),但这可以解决它。
这是自定义菜单下的脚本。
For Each Row( If( Is Missing( :Comment ) == 0, V Line( row()-1 ) ) );
For Each Row(
If( Is Missing( :Comment ) == 0,
Text( Right Justified, { row()-1, Col Maximum( :Data ) * 1.2}, :Comment )
)
);
我将 :ID 列替换为 row()-1,以使用该位置的行号,然后将其移回一位。
嗨拜伦,
我尝试将脚本复制到 SPC 图表生成器中
我已向您发送了该文件的链接并有以下评论
1_Control Chart by ID:这是您的控制图,未更改 - 一切都很好

2_Control Chart by ID & Control Chart builder:这是从 (#1) 复制到图表生成器中的脚本 - 垂直线在 x 轴上偏移一处,请参阅第一个两个特殊原因
控制图生成器

3_ID 控制图和控制图生成器 AS 数字/连续:如果我将 ID 从数字/序数更改为数字/连续,那么一切都很好

4_Control Chart by ID & Control Chart builder AS 数字/连续字母/数字):但我想在 x 轴上绘制字母/数字批号,它再次关闭

这让我抓狂,你能帮忙吗?我将文件位置发送给你
https://1drv.ms/u/s!Au2FkmkZvSi-sA8j_g625J1VFdtw?e=0UPtz6
干杯伊恩