SAS

attribute mapを極める(2) discrete attribute mapの使い方

前回に引き続きattribute mapの話題です。今回はattribute mapの使い方について。
attribute mapはGTLの場合テンプレートに直接指定する方法とattribute map datasetを使う2通りの方法があります。
sgplotでもattribute mapを使用できますが、attribute map datasetのみをサポートしているようです。

attribute mapの基本構文

テンプレート内に直接指定する方法

attribute mapをテンプレート内で指定する場合は、begingraphブロック内で指定する必要があります。

discreteattrmap  name= / < options >;
value "group name1"  / lineattrs=(settings)
textattrs=(settings)
fillattrs=(settings)
outlineattrs=(settings);
< value statement >
enddiscreteattrmap;

attribute mapの定義はdiscreteattrmapブロック内に記述します。valueステートメントで群変数の値(フォーマットを適用した文字列)を指定し、オプションでグラフオブジェクトの属性を指定します。
lineattrsは線の属性、textattrsはテキストの属性、fillattrsは塗りつぶしの属性、outlineattrsは枠線の属性を意味します。

属性の定義はカッコで囲んで指定しますが、デフォルトのグラフ属性(GraphData1-GraphData12)を呼びだしてその一部を変更して指定することも可能です。

例えば以下の例では線の属性をGraphData1とGraphData2を指定し、線の種類だけを別のものに変更しています。既存のグラフ属性の一部を上書きしているわけです。

value "1671 WTI原油価格連動型上場投信"  / lineattrs=GraphData1(pattern=shortdash);
value "1540 純金上場信託(現物国内保管型)" / lineattrs=GraphData2(pattern=mediumdashshortdash);

既存のグラフ属性を上書きする

attribute mapを定義したら次はattribute variableを作成します。attribute variableはデータセットの群変数にattribute mapの情報を結合して作成される特殊な変数です。plotステートメントのgroupオプションで
attribute variableを指定すると、attribute mapの定義をプロットに反映することができます。

discreteattrvarステートメントはattributemap名とデータセットの群変数を指定することで、任意の名前のattribute variableを作成することができます。

discreteattrvar attrvar=< attribute variable >  var=< variable of dataset >  attrmap="< attribute map name >";
 / group=;

discrete attribute data setを読み込ませる方法

attribute mapの定義内容をデータセットとして定義し、そのデータセットを読み込ませることもできます。この方法だとテンプレートを修正せずにグラフオブジェクトの属性を切り替えることができる点はメリットですが、
データセットを作成する手間と考えるとあまり工数的にはおいしくない気がしています。データステップで機械的にデータセットを作成することはたいていの場合難しく、定義内容をデータステップに直打ちすることが多いからです。前回のETFの終値推移をattribute datasetを使ってattribute mapを指定すると以下のようになります。

Copy
proc template; define statgraph seriesplot2; begingraph; discreteattrvar attrvar=grp var=ticker attrmap="tick"; entrytitle "金ETFと原油ETFの比較"; layout overlay / xaxisopts=(griddisplay=on) yaxisopts=(griddisplay=on) ; seriesplot x=DATE y=END_PRICE / name="series" group=grp; discretelegend "series"; endlayout; endgraph; end; run; *attribute data set; data attr; length ID value linestyleelement linepattern $100; ID="tick"; value="1671 WTI原油価格連動型上場投信"; linestyleelement="GraphData1"; linepattern="ShortDash"; output; ID="tick"; value="1540 純金上場信託(現物国内保管型)"; linestyleelement="GraphData2"; linepattern="MediumDashShortDash"; output; run; *dattrmapオプションでattribute map datasetを指定する; proc sgrender data=wk1 template=seriesplot2 dattrmap=attr; run; *出力結果は上記の出力結果と同じなので省略;

テンプレートからdiscreteattrmapブロックがなくなり、そこ代わりにデータステップで定義しています。
それ以外の部分はテンプレートに直接指定する場合と変わりません。

sgrennderプロシジャを実行するときにdattrmapオプションでattribute map datasetを指定することで、作図時に任意のattribute mapに切り替えることができるようになります。
この方法であればsgplotでもattribute mapを利用することが可能です。

ですが、データセットの作成プログラムを見ると変数長の指定やattribute map datasetの仕様に沿った変数名の指定が必須となります。この仕様のためデータセット作成はちょっとめんどくさいです。

指定できる変数は以下のURLを参考にしてください。

データセット作成よりもテンプレートを直接書き換えたほうが楽なので、attribute mapを利用する場合はテンプレート内で直接指定する方法を推奨します。