ラベル [▼ グラフ の投稿を表示しています。 すべての投稿を表示
ラベル [▼ グラフ の投稿を表示しています。 すべての投稿を表示

2021年7月22日木曜日

Graph Template Language(GTL)入門:凡例の設定 (DISCRETELEGEND)


GTLで凡例を設定する「DISCRETELEGEND」と「MERGEDLEGEND」を紹介します。



凡例の表示

まずは例を示して、その後構文を紹介したいと思います。



proc template ;
  define statgraph MYTEMP ;
     begingraph;

          layout overlay;
               scatterplot x=HEIGHT y=WEIGHT / group=SEX name="sca" ;
               regressionplot x=HEIGHT y=WEIGHT / group=SEX name="regr" ;
               discretelegend "sca" "regr" / title="凡例";
          endlayout;

     endgraph;
  end;
run;

proc sort data=SASHELP.CLASS out=CLASS;
  by SEX;
run;
proc sgrender data=CLASS template=MYTEMP ;
run;




  • 「SCATTERPLOT」で凡例の参照名 "sca" を定義しておく
  • 「REGRESSIONPLOT」で凡例の参照名 "regr" を定義しておく
  • 「DISCRETELEGEND」で参照名 "sca" と "regr" を指定してこれらの凡例を表示しています
  • それぞれのPLOTステートメントで「GROUP=SEX」としているので、グループ変数をSEXとして凡例が表示されています。

構文

PROC TEMPLATE ;
   DEFINE STATGRAPH テンプレート名;
   BEGINGRAPH ;
         LAYOUTステートメント;

                PLOTステートメント  /  NAME = "参照名";
                DISCRETELEGEND  "参照名"  / オプション;

         ENDLAYOUT;
   ENDGRAPH;
   END;
RUN;

  • PLOTステートメントの「NAME=」で凡例の参照名を設定 (任意の名前でOK)
  • DISCRETELEGENDで参照名を指定して、凡例を表示します。



DISCRETELEGENDのオプション  (随時追加予定)

注意:
他のオプション・ステートメントとの組み合わせで、オプションが無効になることがあるため、トライ&エラーで正しく動くか確認が必要です。

設定内容設定
凡例タイトル
title = "タイトル"
凡例タイトルのボーダー
titleborder = true | false
凡例タイトルの書式
titleattrs = (
         family = 'フォント'
         size = サイズ
         color = 
         weight = bold  /* 太字 */
)
凡例の書式

valueattrs = (
         family = 'フォント'
         size = サイズ
         color = 
         weight = bold  /* 太字 */
)
凡例の書式で文字の大きさを変えたときに
凡例のマーカー等も大きくするか
autoitemsize = true | false
凡例のボーダーborder = true | false
凡例の表示順 (横順か縦順か)order = rowmajor | columnmajor
凡例の縦位置
valign = top | bottom | center
凡例の横位置halign = right | left | center
凡例の背景色backgroundcolor = 
「order = rowmajor」指定時に
水平方向に表示する凡例エントリの数
across = 数
「order = columnmajor」指定時に
垂直方向に表示する凡例エントリの数
down = 




凡例の結合


MERGEDLEGENDステートメントは使える条件が限定されますが、凡例を結合 (融合?) させることが出来ます。


proc template ;
  define statgraph MYTEMP ;
     begingraph;

          layout overlay;
               scatterplot x=HEIGHT y=WEIGHT / group=SEX name="sca" ;
               regressionplot x=HEIGHT y=WEIGHT / group=SEX name="regr" ;
               mergedlegend "sca" "regr" / title="凡例";
          endlayout;

     endgraph;
  end;
run;

proc sort data=SASHELP.CLASS out=CLASS;
  by SEX;
run;
proc sgrender data=CLASS template=MYTEMP ;
run;



「SCATTERPLOT」と「REGRESSIONPLOT」はそれぞれグループ変数をSEXにしてPLOTしていますが、凡例のマーカーと線をグループごとにくっつけてしまおう、ということでMERGEDLEGENDを使っています。


MERGEDLEGENDが使える条件
  • PLOTステートメントに「GROUP=」で、グループ化した値を凡例に表示している場合
  • マーカーと線を結合する場合のみ?に有効らしい
  • MERGEDLEGENDで指定可能なオプションはDISCRETELEGENDとほぼ同じ


凡例の設定


2020年2月6日木曜日

グラフのマーカーや線などの属性をGROUP毎に設定する【Attribute Map Statement 編】



「Attribute Map Statement」を利用して、GTLでマーカーや線などの属性を定義する方法を紹介。



と、その前に、以前「Attribute Map Dataset」を紹介しました。
グラフのマーカーや線などの属性をGROUP毎に設定する【Attribute Map Dataset 編】


今回はもう1つの方法として「Attribute Map Statement」を紹介していきます。
(※Attribute Map StatementはGTLのみの機能となります)



さっそくサンプルプログラム

proc template ;
     define statgraph MYTEMP ;
     begingraph;

     /* Attribute Map を定義 */
     discreteattrmap name="mymap";
        value "11" "12" / markerattrs=(color=blue    symbol=starFilled        size=11);
        value "13" "14" / markerattrs=(color=yellow symbol=TriangleFilled  size=11);
        value other       / markerattrs=(color=red      symbol=CircleFilled     size=11);
     enddiscreteattrmap;

     /* 「Attribute Map」と「グループ変数」を関連付ける */
     discreteattrvar  var=age attrmap="mymap" attrvar=myvar;

     /* 「Attribute 変数」の使用 */
     layout overlay;
          scatterplot x=HEIGHT y=WEIGHT / group=myvar grouporder=ascending name="leg1";
          discretelegend "leg1" / title="Age";
     endlayout;

     endgraph;
     end;
run;

proc sgrender data=SASHELP.CLASS template=MYTEMP;
run;


上の例では以下のような設定をしています。
  • 年齢(AGE)をグループ変数として、マーカーの種類と色を以下に設定
  • AGEが「11」「12」の時、青色の星マーク
  • AGEが「13」「14」の時、黄色の三角マーク
  • AGEが上記以外の時、赤色の丸マーク


ではどのように設定しているか見ていきましょう。




Step1. 「Attribute Map」を定義する


まずは、グループ変数の値にどういった書式(属性)を割り当てるのか?を定義します。

構文
DISCRETEATTRMAP  NAME="Attribute Mapの名前";
     VALUE  "グループ変数の値1"  /  属性;
     VALUE  "グループ変数の値2"  /  属性;
     …
ENDDISCRETEATTRMAP;


今回は以下のように書いています。

discreteattrmap name="mymap";
   value "11" "12" / markerattrs=(color=blue    symbol=starFilled        size=11);
   value "13" "14" / markerattrs=(color=yellow symbol=TriangleFilled  size=11);
   value other       / markerattrs=(color=red      symbol=CircleFilled     size=11);
enddiscreteattrmap;

  • 「mymap」というAttribute Map を定義
  • グループ変数の値が「11」「12」の時、青色の星マーク
  • グループ変数の値が「13」「14」の時、黄色の三角マーク
  • グループ変数の値が上記以外の時、赤色の丸マーク


ちなみに属性には「マーカー」や「塗りつぶし」といった設定を行う以下の属性オプションが用意されています(GTL書いたことある人ならお馴染みの書き方)

  • MARKERATTRS=()
  • FILLATTRS=()
  • LINEATTRS=()
  • TEXTATTRS=()


重要ポイント

グループにする変数にFORMATが割り当てられている場合、FORMATを当てた後の値を指定する事。
例えば年齢をグループ変数とする場合、11 = "11歳" のようにFORMATが当てられている場合、"11歳" の方を指定する。

discreteattrmap name="mymap";
   value "11歳"  / markerattrs=(color=blue symbol=starFilled  size=11);
enddiscreteattrmap;




Step2. 「Attribute Map」と「グループ変数」を関連付ける


次に、先ほど定義した「Attribute Map」と「実際のグループ変数」を関連付けます。


構文
DISCRETEATTRVAR
    VAR              = グループ変数
    ATTRVMAP  = "グループ変数と関連付けるAttribute Map"
    ATTRVAR     = グループ変数とAttribute Mapの関連付けに対して、任意の名前を定義
;


今回は以下のように書いています。

discreteattrvar var=age attrmap="mymap" attrvar=myvar ;

「グループ変数=AGE」と「Attribute Map="mymap"」を「myvar」という名前(Attribute変数)で関連付けています。



Step3. 「Attribute変数」の利用


あとはPLOTするときに、グループ変数として「Attribute変数」を指定すればOK

scatterplot x=HEIGHT y=WEIGHT / group=myvar grouporder=ascending ;

これで、Attribute Mapの定義に基づいてマーカーの種類や色などの属性を展開してPLOTしてくれます。

注意:
SAS9.4M3より前のバージョンでは、この機能 (Attribute Map Statement) と一緒に、PLOTステートメント (SCATTERPLOTやSERIESPLOTなど) でも属性を定義している場合、結果のプロット部分と凡例部分の属性が一致していないおかしな状態になってしまうことがある?らしいので注意。



2019年3月19日火曜日

【小技】ODSグラフの保存時、ファイル名にBY値を入れる




まず、前提知識として以下「ODSグラフを画像ファイルとして保存する方法」を一読ください。
https://sas-boubi.blogspot.com/2015/09/odssg.html



そして今回紹介するのが、SAS9.4M5からの新機能。
以下のプログラムをご覧ください。

proc sort data=sashelp.class out=class;
   by age;
run;

options nobyline;
ods graphics  /  reset=index imagename='test_#byval1'  outputfmt=png;
ods html close;   /* ←他に開いているODS出力先があれば全てCLOSEして下さい */
ods listing gpath="出力するパスを指定";

   proc sgplot data=class;
      scatter x=height y=weight;
      by age;
   run;

ods listing close;
ods graphics  /  reset=all;
ods html; /* ←デフォルトの出力をHTMLにしている場合に記述  */
/* その他、デフォルトの出力があれば、適宜記述 */


「ODS GRAPHICS」の「IMAGENAME=」の中で#BYが使えるようになりました!
上の例では「test_11.png、test_12.png・・・」という感じでファイルが作られます。


「OPTIONS NOBYLINE」と#BYの具体的な挙動は以下のリンク記事を参照下さい。



ただし!!

現状、#BYLINEと#BYVAR は挙動が安定していなかったので使用しない方が良さそう。
具体的には

  • #BYLINEを指定するとログにWARNINGがでて環境によってはファイル名もおかしくなる(そもそもリファレンスにも#BYLINEの使用について言及されていない)
  • #BYVARを指定すると、BY変数にラベルがついてても、ラベルではなく変数名が返される(リファレンスに書かれている挙動と異なる)

将来のバージョンで修正されるかもしれないですが、現状は#BYVALのみ使うほうがよさそうです。



2019年3月14日木曜日

グラフに画像を貼り付ける【GTL編】




以下は数年前に堀切菖蒲園てとこで撮った花菖蒲です。超時期外れですが。




この写真をGTLのDRAWIMAGEステートメントを使ってグラフ内に描画してみます。

proc template ;
    define statgraph MYTEMP ;
    begingraph ;

    layout overlay;
       scatterplot x=petallength y=petalwidth / group=species name="leg1" markerattrs=(symbol=circlefilled);
       drawimage "保存先のパス\flower.JPG" / transparency=0.7
                                                                       width=100
                                                                       height=100
                                                                       sizeunit=percent
                                                                       drawspace=GraphPercent;
       discretelegend "leg1" / title="Age";
    endlayout;

    endgraph;
    end;
run;

proc sgrender data=SASHELP.IRIS template=MYTEMP;
run;


使ったデータはSASHELP.IRISなので、写真とグラフの内容が合ってますね
(厳密に言うと写真とSASHELP.IRISは別の種だけど、同じアヤメ科アヤメ属の植物ということで・・)


設定してるオプションについてもざっくり説明をしておきます。

  • transparency=0.7 … 透明度を0.7に
  • width=100 height=100 sizeunit=percent … 幅と高さを100%に
  • drawspace=GraphPercent … 画像の描画範囲をグラフエリア全体に



これって応用範囲が広くて、例えばグラフの中にグラフを貼ったり、以下のように会社とかのロゴをグラフの隅に貼り付けたりとか、色々できます。

proc template ;
    define statgraph MYTEMP ;
    begingraph ;

    entrytitle "";
    layout overlay;
       scatterplot x=petallength y=petalwidth / group=species name="leg1" markerattrs=(symbol=circlefilled);
       drawimage "貼り付けるファイルを指定" / transparency=0.5
                                                                          width=40
                                                                          sizeunit=percent
                                                                          drawspace=datapercent
                                                                          x=0 
                                                                          y=100
                                                                          anchor=topleft;
        discretelegend "leg1" / title="Age";
    endlayout;

    endgraph;
    end;
run;

proc sgrender data=SASHELP.IRIS template=MYTEMP;
run;

  • transparency=0.5 … 透明度を0.5に
  • width=40 sizeunit=percent … 幅を40%に
  • drawspace=datapercent x=0 y=100 anchor=topleft … 画像の描画範囲をPLOTエリアにして、左上に表示されるよう調整



2019年2月22日金曜日

グラフのマーカーや線などの属性をGROUP毎に設定する【Attribute Map Dataset 編】



「Attribute Map Dataset」を利用して、「SGPLOT」や「GTL」でマーカーや線などの属性を定義する方法を紹介します。




まず、以下の可愛らしいグラフをご覧ください。




年齢ごとに、マーカーの種類や色を変えて散布図を描いてます。
どうやってるか解説していきたいと思います。





Step1. 「Attribute Map Dataset」を作成する


まずグループ(年齢)毎にマーカーの種類や色を定義したデータセットを作ります。
(このデータセットを「Attribute Map Dataset」と呼びます)

data MYMAP;
input ID:$20. VALUE:$30. MARKERCOLOR:$30. MARKERSYMBOL:$30. MARKERSIZE:8.;
cards;
myid 11 blue CircleFilled 11
myid 12 red  StarFilled 11
myid 13 yellow TriangleFilled 11
myid 14 lightgreen DiamondFilled 11
myid 15 black SquareFilled 11
myid 16 skyblue TriangleDownFilled 11
;

proc sort data=MYMAP;
   by ID;
run;



たとえば1OBS目では以下を設定しています。
  • グループのIDを「myid」と設定
  • グループの値(今回は年齢)が「11」の時に、
  • マーカー色「blue」
  • マーカーの種類「CircleFilled」
  • マーカーサイズ「11」



データセットには以下のような変数を含めることが出来ます(一部抜粋)

変数設定内容備考
ID文字ID値PROC SORTでIDの順にソートする事をお勧めします。

例えば、各オブザベーションのID値の順番が "myid", "myid2", "myid" のように異なるID値が間に入ると正しく動作しません。

VALUE文字グループの値例えば年齢をグループにするのであれば年齢の値を指定

グループにする変数にFORMATが割り当てられている場合、FORMATを当てた後の値を指定する事。

例えば 11 = "11歳" のようにFORMATが当てられている場合、"11歳" の方を指定する。

・"_OTHER_" と "_MISSING_" はSAS内部での予約語なので注意。バージョン毎に予約語が増えるかも

FillColor文字塗りつぶしの色棒グラフの中の色など
MarkerColor 文字マーカーの色散布図のマーカーの色など
MarkerSize数値マーカーのサイズ散布図のマーカーのサイズなど
MarkerSymbol文字マーカーの種類散布図のマーカーの種類など
LineColor文字線の色折れ線グラフの線の色など
LinePattern数値/
文字
線の種類折れ線グラフの線の種類など
LineThickness数値線の太さ折れ線グラフの線の太さなど
…等々

(「ID」と「VALUE」は必ずデータセットに含める必要があり、それ以外は任意)





Step2. グラフを描画


Step1で作った「Attribute Map Dataset」をSGPLOTまたはGTLで参照してグラフを描くことが出来ます。


📝 注意

SAS9.4M3より前のバージョンでは、この機能 (Attribute Map Dataset) と一緒に、PLOTステートメント (SCATTERやSERIESなど) でも属性を定義している場合、結果のプロット部分と凡例部分の属性が一致しないおかしな状態になることがある?らしいので注意。

その他、気づいた範囲で注意点を以下例とともに記載しているので要確認です。


  • SGPLOTで描画
proc sgplot data=SASHELP.CLASS dattrmap=MYMAP;
   scatter x=HEIGHT y=WEIGHT / group=AGE grouporder=ascending attrid=myid;
run;

  • group=」でAGE毎に散布図を描いています。
  • dattrmap=」で参照する Attribute Map Dataset を指定。
  • attrid=」で参照する Attribute Map Dataset のID値を指定。
  • 以下のように同じグループ変数に異なるID値を割り当てるような事は出来ません(正しく動作しない&ログにWARNINGが出る)  

scatter x=XX1 y=YY1 / group=AGE attrid=myid;
scatter x=XX2 y=YY2 / group=AGE attrid=myid2;



  • GTLで描画
proc template ;
     define statgraph MYTEMP ;
     begingraph;

     layout overlay;
          scatterplot x=HEIGHT y=WEIGHT / group=AGE grouporder=ascending name="leg1";
          discretelegend "leg1" / title="Age";
     endlayout;

     endgraph;
     end;
run;

proc sgrender data=SASHELP.CLASS template=MYTEMP dattrmap=MYMAP;
     dattrvar AGE="myid";
run;

  • group=」でAGE毎に散布図を描いています。
  • dattrmap=」で参照する Attribute Map Dataset を指定。
  • dattrvar」でグループ変数AGEに対応づけるAttribute Map DatasetのID値を指定。
  •   以下のように同じグループ変数に異なるID値を割り当てるような事は出来ません(正しく動作しない)

dattrvar AGE="myid" AGE="myid2";



2019年2月7日木曜日

2軸グラフの描き方【GTL編】




YAXIS=オプション」で、左右のY軸を使うことが出来ます。


これにより、以下例のように
  • 1つ目の折れ線のY軸のスケールを左側に示し
  • 2つ目の折れ線のY軸のスケールを右側に示す
という事が出来ます。



* 使用するデータの準備 ;
proc sort data=SASHELP.ELECTRIC  out=ELECTRIC;
    by YEAR;
    where CUSTOMER = "Residential";
run;

* 2軸グラフを描く ; 
proc template ;
    define statgraph MYTEMP ;
    begingraph;
        layout overlay;
               seriesplot x=YEAR y=COAL                / yaxis=y  lineattrs=(color=blue) name="n1";
               seriesplot x=YEAR y=NATURALGAS / yaxis=y2 lineattrs=(color=red)  name="n2";
               discretelegend "n1" "n2";             
        endlayout;
    endgraph;
    end;
run;

proc sgrender data=ELECTRIC template=MYTEMP;
run;



例では、2つの折れ線を書いて、X軸はYEARを用い、
  • 「YAXIS=Y」で左側のY軸にCOALを設定
  • 「YAXIS=Y2」で右側のY軸にNATURALGASを設定
としています。


ちなみにX軸も「XAXIS=X2」と指定すれば、上側のX軸を使うことも出来ますよ。


2019年2月6日水曜日

2軸グラフの描き方【SGPLOT編】




Y2AXISオプション」で、右側のY軸を使うことが出来ます。


これにより、以下例のように
  • 1つ目の折れ線のY軸のスケールを左側に示し
  • 2つ目の折れ線のY軸のスケールを右側に示す
という事が出来ます。




* 使用するデータの準備 ;
proc sort data=SASHELP.ELECTRIC  out=ELECTRIC;
    by YEAR;
    where CUSTOMER = "Residential";
run;

* 2軸グラフを描く ; 
proc sgplot data=ELECTRIC;
    series x=YEAR y=COAL               / lineattrs=(color=blue);
    series x=YEAR y=NATURALGAS / lineattrs=(color=red)  y2axis ;
    xaxis type=discrete;
run;



例では、2つの折れ線を書いて、X軸はYEARを用い、
  • 左側のY軸にCOALを設定
  • 右側のY軸にNATURALGASを設定
としています。


ちなみにX軸も「X2AXIS」と指定すれば、上側のX軸を使うことも出来ますよ。



2018年5月18日金曜日

ODSグラフを画像ファイルとして保存する際、ファイル名の末尾の開始番号を指定する




ODSグラフを画像ファイルとして保存する方法自体は、以下記事をご覧下さい。
(特に画像ファイル名がおかしくなる場合がある件を知らない方は要チェック!)

http://sas-boubi.blogspot.jp/2015/09/odssg.html



そして今回は、SAS9.4のメンテナンスリリース3から追加になった機能の紹介です。
まず以下のプログラムをご覧ください。

ods graphics  /  reset=index  imagename="SAMPLE"  outputfmt=png ;
ods html close;
ods listing gpath="C:\TEST";

      proc sort data=SASHELP.CLASS OUT=CLASS;
         by AGE;
      run;

      proc sgplot data=CLASS;
         scatter x=HEIGHT y=WEIGHT;
         by AGE;
      run;

ods listing close;
ods graphics  /  reset=all;
ods html;


by変数AGEの値毎に以下6個のグラフが作られます。ここまでは今までの機能です。

SAMPE.png
SAMPE1.png
SAMPE2.png
SAMPE3.png
SAMPE4.png
SAMPE5.png



では次に上のプログラムの青字箇所を以下のように変えて再実行してみます。

reset=index(100)  

すると、ファイル名の末尾の番号が100から始まるようになりました。

SAMPE100.png
SAMPE101.png
SAMPE102.png
SAMPE103.png
SAMPE104.png
SAMPE105.png



SAS9.4のメンテナンスリリース3から、ファイル名末尾の開始番号を指定出来るようになりました。

ODS GRAPHICS / RESET = INDEX( ファイル名末尾の開始値 ); 



なので、開始値を1からにしたい場合、

reset=index(1)  

とすれば、SAMPLE1.png ~ SAMPLE6.png と作ることが出来ます。




2016年12月27日火曜日

Graph Template Language(GTL)入門:軸の設定



GTLでX軸とY軸を設定する方法をまとめました。

ここでは「LAYOUT OVERLAY」内で軸を設定する方法を紹介します。
(LAYOUTステートメントの種類によって設定が異なる)



まず以下のように軸の場所によってオプションの名前が決まっています。





構文
PROC TEMPLATE ;
   DEFINE STATGRAPH テンプレート名;
   BEGINGRAPH ;
        LAYOUTステートメント  /  XAXISOPTS  = ( x軸オプション )
                                                    YAXISOPTS  = ( y軸オプション )
                                                    X2AXISOPTS = ( x2軸オプション )
                                                    Y2AXISOPTS = ( y2軸オプション )
                                                    WALLDISPLAY = NONE    /* 未使用の軸を消す */ ;

                    PLOTステートメント    /  XAXIS=X または X2    YAXIS=Y または Y2;     /* 使用する軸 */

        ENDLAYOUT;
   ENDGRAPH;
   END;
RUN;

PLOTステートメントで、使用する軸を設定できます(デフォルトは「XAXIS=X YAXIS=Y」)



軸オプション  (一部抜粋) 


オプションの組み合わせ・データの性質等で、挙動が変わったり、動作しないことが頻発しがちです。
リファレンスを見ながらトライ&エラーで書いていく感じになります。

設定内容設定( 以下「|」 は構文ではなく「または」の意味で記載)
軸に表示するパーツ

display = line | label | ticks | tickvalues ) | none

(複数指定可。noneの場合だけカッコで囲む必要なし。
このオプションが未指定だと全パーツが表示される)
反対側の軸表示するパーツ

displaysecondary = line | label | ticks | tickvalues )

(複数指定可)
軸ラベル

label = 'ラベル'

(ラベルの文字数が多いとデフォルトでは文字切れを起こす)
軸ラベル位置 

labelposition left | right | top | bottom

(left, rightはx,x2軸のみ、top, bottomはy,y2軸のみ指定可)
軸ラベル書式

labelattrs = (
      family = 'フォント'
      size = サイズ
      color = 
)
目盛の値の書式

tickvalueattrs=(
      family = 'フォント'
      size = サイズ
      color = 
)
グラフ内に目盛線を表示

griddisplay = on
軸を線形軸にする

type = linear
線形軸の設定linearopts (
      viewmin  = 軸の範囲(最小)
      viewmax = 軸の範囲(最大)

      tickvaluesequence = (  ※注意事項あり
                 start = 目盛開始値
                 end   = 目盛終了値
                 increment = 目盛間隔
      )

     
 tickvaluelist = (※注意事項あり  目盛値1 目盛値2 ・・・目盛値リスト )

      tickvaluepriority = true
      ・・・tickvaluelist や tickvaluesequence に指定した目盛の
                 最小・最大を軸に含める(詳細は※こちらを参照)

   
   tickvaluefitpolicy = rotate | rotatealways | stagger など
      ・・・ 目盛の文字が入りきらない時に文字の向き等を変える
             (x,x2,y,y2軸で指定できるオプションの値が異なる)

      
tickvaluerotation = vertical・・・目盛の文字を縦向きに
             (x,x2軸のみ指定可。tickvaluefitpolicyと組み合わせて使用する)
)
軸を離散値にする

type = discrete
離散値の設定discreteopts = (
      tickvaluelist = ( "目盛値1" "目盛値2" ・・・目盛値リスト )
             (注意:このオプションを設定した場合、
                指定しなかった目盛値はデータ部分もグラフから削除される)


      tickvalueformat = 目盛に当てるフォーマット

      tickvaluefitpolicy= rotate | rotatealways | stagger | extract など
      ・・・ 目盛の文字が入りきらない時に文字の向き等を変える
             (x,x2,y,y2軸で指定できるオプションの値が異なる)

 
     tickvaluerotation= vertical ・・・目盛の文字を縦向きに 
             (x,x2軸のみ指定可。tickvaluefitpolicyと組み合わせて使用する)
)



proc template ;
   define statgraph MYGRAPH;
      begingraph;
      layout overlay / walldisplay=none
                              xaxisopts=(labelposition=right griddisplay=on linearopts=(viewmin=10 viewmax=20));

        scatterplot x=AGE y=WEIGHT;
   
      endlayout;
   endgraph;
end;
run;

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;



2016年10月25日火曜日

グラフ描画時にデータセットが作れる



(注意:今回のテクニックにGPLOTは含まれません)



SGPLOTでグラフを書くときに「ODS TRACE ON/OFF」で囲って実行してみましょう。

ods trace on;
proc sgplot data=SASHELP.CLASS;
  vbar AGE;
run;
ods trace off;

ログ

ログを見ると「SGPlot」という出力オブジェクトが作成されている事が分かります。


この出力オブジェクトを以下のように「ODS OUTPUT」に指定してやると、、

ods output SGPlot=OUT1;
proc sgplot data=SASHELP.CLASS;
  vbar AGE;
run;
ods output close;

データセット:OUT1

なんとグラフ描画時に内部的に作られた?データセットを出力する事が出来ます。



役に立つ例

「ODS GRAPHICS ON;」とすると、一部の統計プロシジャで統計量と一緒にグラフも出力されるのをご存知ですか?
(出力先がLISTINGの場合は統計プロシジャの結果にグラフは含まれません)

これらのグラフも上記の方法でデータセット化出来ちゃいます。


例えば
「ODS GRAPHICS ON;」かつ出力先がHTMLになっている状態で、以下のようにPROC LIFETESTを実行すると生存曲線も出力されますが、、

ods trace on;
proc lifetest data=sashelp.bmt  ;
  time t * status(0);
  strata group;
run;
ods trace off;

ログ













結果ビューア



これもグラフ用データセットが出力できます。

ods output SurvivalPlot=OUT1 ;
proc lifetest data=SASHELP.BMT ;
  time T * STATUS(0);
  strata GROUP;
run;
ods output close;

データセット:OUT1



あとでSGPLOTやSGRENDERを使って自分好みの生存曲線を描く時にかなり使い勝手のいいデータセットです!(わりとそのまんま使える)

今まで生存曲線を描画するためのデータセットを作るのって結構面倒でしたが、上記の方法でだいぶ楽になると思います。


2016年5月7日土曜日

箱ひげ図をかく 【SGPLOT編】




構文

箱ひげ図の向きによってステートメントが分かれます。


縦向き
  PROC SGPLOT DATA=対象データセット;
      VBOX  分析変数 / CATEGORY=カテゴリ  オプション ;
  RUN;


横向き
  PROC SGPLOT DATA=対象データセット;
      HBOX  分析変数 / CATEGORY=カテゴリ  オプション ;
  RUN;

  • デフォルトで「CATEGORY=」を指定した軸は離散軸になりますが、ユーザー側で線形軸等に変えると、挙動が変わってしまいます。詳細はリファレンスを要確認。



オプション
  設定内容  指定   詳細設定
  箱の幅

  BOXWIDTH  =  0~1

  
  箱の書式

  FILLATTRS  =  (詳細設定) 

  COLOR = 色

  ひげの書式

  WHISKERATTRS  =  (詳細設定) 

  COLOR = 色

  中央値の書式

  MEDIANATTRS  =  (詳細設定)

  COLOR = 色

  平均値の書式 

  MEANATTRS  =  (詳細設定)
  
  COLOR   = 色
  SYMBOL = 表示マーク  

  外れ値の書式 

  OUTLIERATTRS  =  (詳細設定)   

  SYMBOL = 表示マーク 
  

…etc ( 色々できるのでリファレンスを確認してみてください )



注意
  • オプションの組み合わせで挙動が変わる可能性あり。
  • デフォルトで出力される箱ひげ図のタイプ(箱、ひげ、外れ値等の定義)はリファレンスを要確認



1. 簡単な例


title "お魚の体重分布";
proc sgplot data=SASHELP.FISH;
   vbox WEIGHT / category=SPECIES;
run;




2.カスタマイズ

title "お魚の体重分布";
proc sgplot data=SASHELP.FISH;
   hbox WEIGHT / category=SPECIES
                         boxwidth = 0.3
                         meanattrs = (color=black symbol=plus)
                         fillattrs = (color=white)
                         whiskerattrs = (color=black)
                         medianattrs = (color=black)
                         outlierattrs = (symbol=circlefilled);
run;