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など) でも属性を定義している場合、結果のプロット部分と凡例部分の属性が一致していないおかしな状態になってしまうことがある?らしいので注意。



0 件のコメント:

コメントを投稿