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";



0 件のコメント:

コメントを投稿