ここでの目標は、一連の管理図 (またはその他のレポート) を、別の場所で使用できるグラフィック ファイルとして保存することです。
たとえば、10 個の管理図を含む PowerPoint スライド デッキがあります。 毎週月曜日に、スライドデッキの管理図を更新する必要があります。 JMP でグラフを作成し、毎週コピーしてデッキに貼り付けることもできますし、ほとんどの MS 製品で利用できる挿入およびリンク機能を利用することもできます。

これを行うには、管理図を作成し、figure1.png として保存し、PowerPoint を開き、[挿入とリンク] オプション ([挿入] ボタンの小さな下向き矢印) を使用して画像を挿入します。 これを 10 枚のスライドごとに行います。 来週は、各管理図を作成し、それぞれをグラフィック ファイル (つまり、figure1.png、figure2.png...) に保存するだけです。 次に、PowerPoint でスライドデッキを開くと、Figure1.png などの新しいバージョンがデッキに取り込まれます。
面倒そうですか? はい、それはひどいことです。10 個のグラフすべてを PowerPoint ファイルとして JMP に保存し、グラフをコピーして貼り付ける方が簡単です。 しかし! ちょっとした JSL を使用すると、これがすべて非常に簡単になります。その方法を説明します。
始める前に、管理図を作成するための簡単なスクリプトを見て、何が起こっているのかを理解しましょう。
管理図(グループサイズ( 1 )、チャート列( :メトリック 1、個別測定 ))
これを分解してみましょう:
一番外側の層は、管理図()そのレイヤー内には 2 つの部分があります。グループサイズ(1) 、 とチャートの列() 。
各要素には引数があります。たとえば、Group Size には 1 つの引数「1」があります。 Chart Col() には 2 つの引数があります。 1 つ目は、列参照と、その列を使用して作成する管理図のタイプです。 概念的には関数の層があり、スクリプトを作成する 1 つの方法は、内側から外側へ「玉ねぎ」を構築することです。
このスクリプトを記述する方法はおそらく 100 通りあり、ここで行う方法よりも簡単で冗長でないものもあるかもしれません。 ここで私が使用しているアプローチは、JMP のほぼすべてのプラットフォームで機能する傾向がありますが、スクリプトについては少し異なる考え方、つまりスクリプトを徹底的に行う必要があります。
1.アリスト={};ここで、管理図を作成する列名のリストを指定します。 より複雑な例には、リストを生成するために使用されるダイアログや、テーブルから連続する列を選択するためのロジック フィルターが含まれる場合がありますが、それは別のブログ投稿で説明します。
2. a=expr();ここでは、管理図で使用される各関数を取り出して定義していますが、空のままにしています。
a=expr(管理図());引数を置く場所を与えてくれます。 b=expr(グループサイズ(1));挿入する要素の 1 つです管理図( ) 、 とc=expr(チャートcol(...も「a」に挿入されます。 」 expr() 「機能を理解することが重要です。 そこにあるものは評価されず、「読み取られて」何かが作られることもありません。 たとえば、話す( "こんにちは" );スクリプトに含まれていた場合、JMP は「こんにちは」と返しますが、 s=式(話す( "こんにちは" ) );スクリプトに含まれていた場合、「s」を評価するか、明示的にスクリプト化された eval(s) を評価するまでは何も起こりません。 (さらに言えば、コードの 1 行に「s;」があった場合、JMP はそれを評価して「hello」と判断します)。 ここで私が使っているのはexpr()後で使用する部品を保持します。
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 ループの始まりです。または、この一連の条件について、条件が true でなくなるまでこれを続けます。 したがって、i=1 となり、i が「alist」内のものの数以下である間に、次の処理を実行します。 変数「i」はループごとに 1 ずつ増加し、このカウンター変数をループ内の他の処理に使用できます。 最初のループでは i=1 なので、「alist, subscript, i」と言って「alist」の最初のものを取得するために使用します。 スクリプトの後半では、保存するファイルの名前に i を使用します。 ファイル名のシリアルリスト (figure1、figure2、figure3...) が必要です。 これを取得するには、接頭辞を I と連結します。 問題がある場合を除いて、数値を連結することはできないので、「」と言う必要があります。パス/図"||char(i)||".png " 数値 i をラップする必要があります文字( ) 、その後、文字として他の文字と連結できます。 (引用符で囲まれたもの。)
4. obj=eval(a);スクリプトのこの時点では、管理図()関数には必要なすべての引数がパックされているので、それを評価します。 変数「obj」は、生成されたばかりの管理図と通信するための「ハンドル」として使用できることに注意してください。
5. obj<<画像を保存(...この最後のステップでは、obj の内容を png 画像ファイルとして保存します。 ファイル名には .png 拡張子が付いており、ファイル名の直後に次の引数が「png」であることに注意してください。 これは、.gif 拡張子を持つファイルを .png ファイル タイプとして保存できることを意味します。 強くお勧めしますいいえ拡張子とファイルの種類が一致していません。
6. obj<<ウィンドウを閉じる;これはただの掃除です。 自分が作成した JMP レポートを見たい場合は、これがコメントアウトされます。
7. 最後のビットは「);」です。これは、先頭の For( の閉じ括弧です。 実際にコーディングするときは、ループの終わりに「//end of 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;
);