SAS

attribute mapを極める(3) range attribute mapの使い方

discrete attribute mapは離散値とグラフオブジェクトの属性を紐づける仕組みであるのに対し、range attribute mapは連続変数を色の階調やグラデーションに紐づける仕組みです。
range attribute mapは主にcolorresponseオプションが使用できるプロットで使用できます。

基本構文

define statgraph < template name >; 
begingraph;
 
rangeattrmap name=< attribute map name >; 
   range < range statement > / < options >; 
endrangeattrmap; 

rangeattrvar var= < variable name > attrmap= < attribute map > attrvar = < attribute variable > ; 

< layout block > 
   < plot statement > 
   colorresponse= < attribute variable > ; 

< end layout block > 

....

range attribute mapの定義はbegingraphブロック内で定義し、rangeattrvarステートメントで作図変数にattribute mapの情報を結合したattribute variableを作成します。

plotステートメントでこのattribute variableを指定すれば、attribute mapを反映させることができます。

discrete attribute mapと基本的に同じです。

range ステートメント

ステートメントの説明は作図例を見たほうが早いでしょう。今回はヒートマップの紹介で使用したテストデータを使ってrange attribute mapを定義してみます。

GTLでヒートマップを作図する heatmapステートメントヒートマップは2次元データの各数値の大きさを色で表現したグラフです。DNAマイクロアレイのデータやWEBのアクセス解析でよく使われます。...
proc template ; 
define statgraph heatmap2; 
begingraph; 
entrytitle "旅客機の搭乗人数"; 

rangeattrmap name="range"; 
   range min - < 200 / rangecolor=gradientstepper(yellow,green, 4, 1); 
   range 200 - < 300 / rangecolor=gradientstepper(yellow,green, 4, 2); 
   range 300 - < 400 / rangecolor=gradientstepper(yellow,green, 4, 3); 
   range 400 - max / rangecolor=gradientstepper(yellow,green, 4, 4); 
endrangeattrmap; 

rangeattrvar attrmap="range" var=passengers attrvar=_res; 

   layout overlay ; 
      heatmapparm x=year y=month colorresponse=_res /
         name="heat" ; 

      continuouslegend "heat"; 
   endlayout; 
endgraph; 
end; 
run;
range attribute mapの利用例

数値の範囲の指定

rangeステートメントで色を定義したい数値範囲を指定します。

「下限値 – 上限値」の形式で指定でき、「<」を追加すると、指定した数値を超える、あるいは指定した数値未満の数値が対象になります。

例えば「200 – < 300 」と指定すると200以上300未満を指定していることになります。

minおよびmaxはattribute mapを適用したい数値変数の最小値と最大値です。ほかにもキーワードがありますが、これだけで十分かと思います。

rangecolorオプション

rangecolorオプションは指定した範囲の数値の色を一つ指定します。rangecolorは塗りを指定し、rangealtcolorはマーカーや線の色を指定します。

この時gradientstepperを使用すると便利です。

gradientstepperは指定した2色の色から指定した数値だけ階調を生成し、そこから任意の色を指定することができます。

例えば

rangecolor=gradientstepper(yellow,green, 4, 1);

の場合はまず黄色から緑までの4段階の階調(色や明るさの濃淡の段階)を生成し、1番目の色(つまり黄色)を取得できます。

3番目の引数は階調数、4番目は階調の中の色を指定します。

四番目の引数に2または3を指定すると、黄色と緑の中間色を指定できるわけです。

rangecolormodelオプション

rangecolormodelは指定した数値範囲に塗りのグラデーションを指定します。
rangealtcolormodelはマーカーや線にグラデーションを設定できます。

試しに乗客数が200以上の場合は乗客数に応じてグラデーションで表現してみます。

proc template ; 
define statgraph heatmap3; 
begingraph; 
entrytitle "旅客機の搭乗人数"; 

rangeattrmap name="range"; 
   range min - < 200 / rangecolor=coral; 
   range 200 - max / rangecolormodel=(lightblue lib); 
endrangeattrmap; 

rangeattrvar attrmap="range" var=passengers attrvar=_res; 

   layout overlay ; 
      heatmapparm x=year y=month colorresponse=_res /
         name="heat" ; 
      continuouslegend "heat"; 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=import1 template=heatmap3; 
run;
colormodelを利用したrange attribute mapの利用例

rangecolormodelで色をリストで指定すると、指定した色を使ってグラデーションを生成します。
rangeステートメントを複数指定すれば特定の範囲は単一色で表現し、それ以外はグラデーションで表現するといったことも可能になります。