這裡的目標是將一系列控製圖(或任何其他報告)保存為可以在其他地方使用的圖形文件。
例如,我有一個 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;
);