SAS

attribute mapを極める (4) discretlegendentrypolicyオプション

attribute mapを利用するとプロットデータに依存せずに任意の凡例項目を作成することができます。

attributemapで凡例項目を定義する。

デフォルトではattribute mapでプロットオブジェクトの属性を定義しても、凡例に表示されるのはデータに表示されているもののみです。
しかしattribute mapのdescretelegendentrypolicyオプションでattrmapを指定すると、データにはない項目であってもattribute mapで定義した項目をすべて凡例に表示できます。
入力データの有無は関係ありません。

discreteattrmap name=識別名 / discretelegendentrypolicy=attrmap; 

< value statement > ; 

enddiscreteattrmap;

discretlegendentrypolicyが未指定の場合

例えば以下のコードを実行すると以下のようになります。

proc template; define statgraph legend2; 
begingraph; discreteattrmap name="group"; 
   value "A" / markerattrs=(symbol=circlefilled color=red); 
   value "B" / markerattrs=(symbol=squarefilled color=blue); 
   value "C" / markerattrs=(symbol=trianglefilled color=green); 
enddiscreteattrmap; 

discreteattrvar var=cat attrmap="group" attrvar=_grp; 

layout overlayequated/
   equatetype=squaredata; 

   scatterplot x=x y=y /
      group=_grp 
      name="scatter"; 

discretelegend "scatter" ; 

endlayout; 
endgraph; 
end; 
run; 

data test; 
x=10; y=20; cat="A";
output; 
x=15; y=30; cat="B";
output;

x=20; y=40; cat="C";
output; 
run; 

ods graphics /reset; 
proc sgrender data=test template=legend2; 
run;
実行結果

もしデータが取得できずにcat=Cのレコードが欠損となった場合、上記のコードを実行すると以下のようになります。


cat=Cのデータが未取得だった場合

凡例からもcat=Cの項目が消えています。作図的には問題ありませんが、cat=Cのデータが計画上収集される予定だったものの取得できなかったのか、それとも最初からCは作図の対象外だったのかはこのグラフだけではわかりません。
そのためデータにはない項目であっても凡例に表示させたほうが好ましいこともあります。

discretlegendentrypolicyを指定した場合

同様のことをdiscretelegendentrypolicy=attrmapを指定した場合でも実行してみます。

proc template; 
define statgraph legend2; 
begingraph; 
discreteattrmap name="group" / discretelegendentrypolicy=attrmap; 
   value "A" / markerattrs=(symbol=circlefilled color=red); 
   value "B" / markerattrs=(symbol=squarefilled color=blue); 
   value "C" / markerattrs=(symbol=trianglefilled color=green); 
enddiscreteattrmap; 

discreteattrvar var=cat attrmap="group" attrvar=_grp; 

layout overlayequated/
   equatetype=squaredata; 

   scatterplot x=x y=y /
      group=_grp 
      name="scatter"; 

   discretelegend "scatter" ; 

endlayout; 
endgraph; 
end; 
run; 

data test; 
x=10; y=20; cat="A";
output; 

x=15; y=30; cat="B";
output; 

run; 

ods graphics /reset; 
proc sgrender data=test template=legend2; 
run;
discretelegendentrypolicy=attrmap

データにはcat=Cのレコードは存在しませんが、凡例には表示されています。これでcat=Cも作図対象であり、今回はデータがなかったことがわかるようになります。

このオプションはGTLで作図する際にはかなり重要なのでおぼえておいたほうが良いでしょう。