ODS Graphics Editorの話 (特別なライセンスなし、SAS/GRAPHでできる便利な機能)

templateプロシジャで、Glaph Template Languageで、グラフのテンプレートを作って、proc sgrenderでそのテンプレートを指定して、プロットする。

SAS9.2以降、SG系グラフの登場により、グラフの表現力はケタ違いにアップしましたが、その代わり、最初のハードルも随分高くなってしまった気がします。

いきなりGTLガリガリ書いてグラフを作るのは、ちょっと難しいので、最初のうちは
SASのグラフサンプル集http://support.sas.com/sassamples/graphgallery/PROC_SGRENDER.html

やSASユーザー総会で公開されているものや、或いは書籍、コピペして、少しずつカスタマイズして
自分のものにしていくのがいいと思います。
リンクさせていただいている「僕の頁 <SASと臨床試験と雑談と>」(http://sasboku.blog.fc2.com/
にもGTLを使ったプロットが公開されていて勉強になります。

で、今回紹介するのは、それとは違ったアプローチです。
GUI、ようはプログラムを書かずに手でグラフを書いて、それを自動的にコード化する話です。

まず、適当なデータをつくります。

data TEST;
call streaminit(2014);
do GROUP='A','B';
 do i=1 to 100;
  x=rand('uniform');
  y=rand('uniform');
  output;
 end;
end;
drop i;
run;


そしたら、まず、SASをインストールする時に、ODS Graphics Editerにチェックをつけた人は、すでにアイコンがあるか、すべてのプログラムから立ち上げられるので、そうしてください。





もし、そういったものが見当たらない人は

%sgdesign;

とエディタに書いて、実行してください。
何かが裏で凄い動いた感じがして、10数秒後、

















こんな画面がでてきます。

ここで、いろんな形のグラフを選ぶことで、実は相当高度なグラフもかけます。
















試しにグラフギャラリーから「グループ化散布図」でも選んでみましょう









グラフを選ぶと、次はグラフに使うデータセットを指定します。
デフォルトがなぜかSASHELPなので、参照元にするライブラリを指定します。


※ちなみにここで、%sgdesign;で起動した人は、WORKの中をみてみましょう。
わけわかんないデータセットであふれているはずですが、これは、グラフを書くサンプル用の
データセットを勝手に用意してくれいるんです。迷惑です。
















で、最初につくったデータセットを指定します


そしたら























X軸に対応する変数とY軸に対応する変数、そしてグループ化する変数をプルダウンで
選びます。

そしたら、それだけで、グラフがポンとでてきます。
で、なんと、そのグラフを手で修正できます。

まずはグラフタイトルをクリックして、好きなタイトルにします



















右クリックで、軸や背景などのいろんなプロパティをいじれます。
感覚的にはEXCELのグラフを編集するのと全く同じです。

背景色を灰色にしてみました。



















要素の追加で、さらにプロットを重ねたり
フリーテキストや凡例などを追加できます



















凡例を追加してみました























やりたい放題やって、気がすんだら、ここからが本番













表示から「コード」をクリックすると





なんと、proc templateでのテンプレート定義から
proc sgrenderの実行までを全てコード化してくれます。


プロットに指定した変数はdynamicステートメントで受け渡すことを想定したコード化を
してくれるので、標準化もしやすく、超便利。

あとはこれをエディタにペタ

proc template;
define statgraph sgdesign;
dynamic _X _Y _GROUP;
begingraph / backgroundcolor=CXE8E6E8;
entrytitle _id='title' halign=center '散布図ですわ' /;
entryfootnote _id='footnote' halign=left 'Type in your footnote...' /;
layout lattice _id='lattice' / columndatarange=data columngutter=10 rowdatarange=data rowgutter=10;
         layout overlay _id='overlay' / xaxisopts=(gridDisplay=on label='X軸のラベルも自由') yaxisopts=(linearopts=(viewmin=0.2 viewmax=0.9 ) tickvalueattrs=(size=12) gridDisplay=on type=linear);
            scatterplot _id='scatter' x=_X y=_Y / group=_GROUP name='scatter';
            discretelegend _id='legend' 'scatter'  / border=true displayclipped=true down=1 halign=center location=inside opaque=false order=columnmajor valign=top;
         endlayout;
endlayout;
endgraph;
end;
run;

proc sgrender data=WORK.TEST template=sgdesign;
dynamic _X="X" _Y="Y" _GROUP="GROUP";
run;

で実行するだけで

さっきまで、手でいじって作ってたグラフが、ポンです。

















これは、GTLを勉強するとき、何と何が結びついているかを理解する上でも、大変役立ちますね。
レイアウト分割の複合グラフを、一からコードで起こすのは、まあ、なかなか、つらいですよね、それはそれで勉強になるけども






3 件のコメント:

  1. いつも、拝見し助かっております。
    ODS Graphics Designerを使って、箱ひげを書いているのですが、SASプログラムでのwhere statementのように、一部のデータの(例えば男性のみのデータ)グラフを書きたい場合どうしたらよいのでしょうか?
    コード化して、where~を入れてみましたが、うまくいきません。
    また、SASプログラムでグラフを書いてeditorで編集しようと思いましたが、軸線を太くしたり、軸の数値を変えたりなどの操作ができなくて、どちらでもうまく作業ができず、困っています。
    ご存知でしたら、教えてください。

    返信削除
  2. すごく悩んでいたのですが、最初の使うデータをwhere~で限定したらできました!

    返信削除
  3. コメントいただきまして有難うございます!すでに解決済みかもしれませんが、おっしゃる通りで、データを予め絞ってしまえばOKです。
    あるいはsgrenderも他のプロシジャ同様、whereステートメントが有効ですので
    proc sgrender data=WORK.TEST template=sgdesign;
    where SEX=1;
    dynamic _X="X" _Y="Y" _GROUP="GROUP";
    run;
    でもOKです。

    軸の編集についてはOds Graphic Editer上では軸のプロパティから、設定しますが箱ひげ図の場合、X軸は不連続量とみなされ値設定できないように制御されているみたいですね。
    コードの場合は
    xaxisopts=(linearopts=(viewmin=1 viewmax=1 ) )などで制御できそうですが、やはりboxplotの場合は無理なようですね。
    軸の太さは、確かまだ設定できるパラメータがなかった気がしますが、ちょっと最近SGグラフ書いてないので怪しいかもです。

    サイト:僕の頁 http://sasboku.blog.fc2.com/
    の方がGTLについてはかなり詳しいので、困った際はコメントで聞いてみるといいかもです。

    返信削除