这里的目标是将一系列控制图(或任何其他报告)保存为可以在其他地方使用的图形文件。
例如,我有一个 PowerPoint 幻灯片,其中有 10 个控制图。 每个星期一我都需要更新幻灯片中的控制图。 我可以在 JMP 中制作图表,然后每周将它们复制并粘贴到图表中,或者我可以利用大多数 MS 产品中提供的插入和链接功能。

为此,我可以制作控制图,将其另存为figure1.png,然后打开PowerPoint,在其中使用“插入和链接”选项(“插入”按钮上的向下小箭头)插入图片。 我会对 10 张幻灯片中的每一张都执行此操作。 下周我将制作每个控制图,并将每个控制图保存到一个图形文件(即figure1.png、figure2.png...)。 然后,当我在 PowerPoint 中打开幻灯片时,figure1.png 等的新版本将被拉入幻灯片。
听起来很乏味吗? 是的,那太可怕了,在 JMP 中将所有 10 个图表保存为 PowerPoint 文件,然后复制并粘贴图表会更容易。 然而! 通过一点 JSL,这一切都变得非常简单,我将向您展示如何操作。
在开始之前,让我们看一个用于制作控制图的简单脚本并了解发生了什么:
控制图(团体人数( 1 ),图表栏(:指标 1,单独测量))
让我们把它拆开:
最外层是控制图() ,该层内部有两部分,团体人数(1) , 和图表列() 。
每个元素都有参数,例如组大小有一个参数“1”。 Chart Col() 有两个参数。 第一个是列引用以及使用该列制作的控制图的类型。 从概念上讲,函数有多层,编写脚本的一种方法是从内到外构建“洋葱”。
编写此脚本的方法可能有 100 又 1 种,其中一些方法可能比我在这里要做的更简单、更简洁。 我在这里使用的方法几乎适用于 JMP 中的每个平台,但它需要以稍微不同的方式来思考脚本编写...从内到外的脚本编写。
1.列表={};这是我提供要从中制作控制图的列名称列表的地方。 更复杂的示例可能有一个用于生成列表的对话框,或者可能有逻辑过滤器来从表中选择连续列,但这是另一篇博客文章的内容。
2. a=expr();在这里,我只是获取控制图中使用的每个函数并定义它们,但将它们留空。
a=expr(控制图());给了我一个发表论点的地方。 b=expr(组大小(1));是我要插入的一个元素控制图( ) , 和c=expr(图表列(...也将被插入到“a”中。 这 ”表达式( ) “理解函数很重要。 里面的内容不会被评估,不会被“读取”并成为某种东西。 例如如果说话( “你好” );在您的脚本中,JMP 会说“你好”,但如果s=表达式(说话( “你好” ) );在您的脚本中,在您评估“s”或显式编写脚本 eval(s) 之前,不会发生任何事情。 (更重要的是,如果“s;”位于代码的一行上,JMP 会评估它,并说“你好”)。 我在这里使用表达式( )保留我稍后想要使用的部件。
3.插入(c, alist[i],1);这里,“c”是一个未评估的参数, Chartcol(单独测量)。Insert into,将列表变量“alist”中的第一个内容插入到“c”的内容中。 所以现在 c 是Chartcol(:指标 1,单独测量)。
这是退一步解释“alist[i]”中的“i”来自何处的好地方。
对于 (i=1, i<=nitems(alist), i++是 For Next 循环的开始,或者 对于这组条件,继续执行此操作,直到条件不成立。 因此,i=1,当 i 小于或等于“alist”中的事物数量时,执行下一件事。 变量“i”在每个循环中都会加一,我们可以将此计数器变量用于循环中的其他操作。 在第一个循环中,i=1,因此我们通过说“alist,下标,i”来使用它来获取“alist”中的第一个内容。 稍后在脚本中,我们将使用 i 作为我们保存的文件的名称。 我想要一个文件名的序列列表(图1、图2、图3...) 为了得到这个,我将前缀与 I 连接起来。 除非有问题,否则我们无法连接数字,所以我们不得不说“路径/图形"||char(i)||".png “ i 必须包含在数字中字符() ,那么作为一个字符,它可以与其他字符连接起来。 (用引号括起来的东西。)
4. obj=eval(a);此时脚本中的控制图()函数已经打包了我需要的所有参数以及评估它的时间。 请注意,“obj”是一个变量,可以用作与刚刚生成的控制图对话的“句柄”。
5. obj<<保存图片(...最后一步将 obj 的内容保存为 .png 图片文件。 请注意,文件名具有 .png 扩展名,然后在文件名之后,下一个参数是“png”。 这意味着可以将扩展名为 .gif 的文件保存为 .png 文件类型。 我强烈推荐不是扩展名和文件类型不匹配。
6. obj<<关闭窗口;这只是清理。 如果您想查看您制作的 JMP 报告,那么这将被注释掉。
7. 最后一位是“);”这是开头 For( 的右括号。 实际上,当您编码时,最好在循环结束时给自己留下注释,例如“//i 循环的结束”,如果您碰巧在其他循环内部进行迭代,这一点尤其重要,它有助于防止事情变得疯狂。
alist={:Metric 1, :Metric 2, :Metric 3};
for(i=1, i<=nitems(alist), i++,
a=expr(control chart());
b=expr(group size(1));
c=expr(chart col(individual measurement));
insert into(c,alist[i],1);
insert into(a,nameexpr(b));
insert into(a,nameexpr(c));
obj=eval(a);
obj<< Save Picture( "/Users/bywing/Byron Wingerd/Examples/example"||char(i)||".png", "png" );<BR /> obj<< Close Window;
);