「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など) でも属性を定義している場合、結果のプロット部分と凡例部分の属性が一致しないおかしな状態になることがある?らしいので注意。
その他、気づいた範囲で注意点を以下例とともに記載しているので要確認です。
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; |
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";
|