SAS

GTLで凡例を極める(1)基本的な操作

凡例(はんれい)はグラフに表示されているマーカーや線などのオブジェクトの説明を箇条書きにして表示したものです。
GTLではlegendステートメントで作成することができます。SAS9.4以降ではステートメントが追加されたため、柔軟な凡例の作成が可能になっています。

基本的な使用方法

legendステートメントは必ず作成対象を指定する必要があります。指定方法は事前にnameオプションで任意の名前を付けておき、legendステートメントにその名前を指定するだけです。

作成対象はplotステートメント, legenditemステートメント、attribute mapのいずれかですが、ほとんどの場合はplotステートメントでしょう。

legendステートメントはlayoutブロック内に設置します。

プロットエリアが一つの場合はlayout overlay, layout overlayequatedあるいは layout regionの内部に設置します。

layout latticeのような複数のプロットエリアを設置する場合は、上記に加えてsidebarブロックまたはgloballegendブロック内に設置することができます。すべてのプロットエリアに共通の凡例を設置する場合はsidebarかgloballegendブロックに設置するとよいでしょう。

ただしprototypeレイアウト内では使用不可です。

layout overlay; 
   scatterplot x=x y=y / 
      name="graph_name"; 
   discretelegend "graph_name"; 
endlayout;

Legendステートメントの種類

discretelegend

もっともよく使うステートメントです。離散変数の情報を箇条書きにして表示でき、グラフの系列名を表示するのに使用します。legendの表示内容は各plotステートメントにより若干異なりますが、基本的にgroupオプションで指定した変数の内容が表示されると考えてよいでしょう。

このステートメントは頻出です。このブログで公開しているテンプレートの多くで使用しています。

coutinuouslegend

連続変数の情報をカラーバーとして表示します。plotステートメントによって若干異なりますが、表示内容はcolorresponseオプションで指定した変数の内容となります。
対象となるplotステートメントは限られており、ヒートマップ、等高線、surfaceプロット、散布図、バブルチャートくらいです。棒グラフの塗りにもcolorresponseを設定できるので棒グラフも使用可能ですが、使用用途が思いつきません。

実際の利用例は以下の記事をご覧ください。

GTLでヒートマップを作図する heatmapステートメントヒートマップは2次元データの各数値の大きさを色で表現したグラフです。DNAマイクロアレイのデータやWEBのアクセス解析でよく使われます。...

legenditem

凡例の要素を直接定義できます。入力データにはないデータを凡例として表示させることができます。
使用例は以下の記事を参照してください。

GTLでスイマープロットを作図する(1)highlowplotステートメント抗がん剤研究でたまに見かけるスイマープロット。聞いたことがない方が多いですが、治療履歴を個々の患者ごとに表示するときは便利なグラフです。...
GTLで凡例を極める(2)legenditemステートメントグラフの凡例は基本的にプロットオブジェクトに関する説明を載せるものなので、それ以外のものを載せることはできません。 しかし作図の都合上...
GTLでSpaghetti plotを作図するSpaghetti plotは一見seriesplotステートメントを使えば簡単なように見えますが、いくつか工夫が必要です。 Spag...

axislegend

軸の目盛りを凡例として表示できます。軸目盛の名称が長いために正常に表示できない場合は、軸目盛と数値として表示し、数値と名称の対応づけを凡例内に表示できます。
離散軸のみ利用できます。

GTLで凡例を極める(2)axislegendステートメント軸目盛の名称が長すぎて作図スペースに収まらないことがある場合は、軸目盛の凡例を空きスペースに設置すると見やすくなります。 GTLでは軸...

legendtextitem

入力データのテキストを凡例として表示できます。散布図のデータラベルが長すぎる場合はこれをつかってデータラベルを凡例として表示させたほうが便利かも

よく使うオプション

私がよく使うオプションを紹介します。このあたりを押さえておけばだいだいOKなはず

autoalignオプション

autoalignオプションはプロットエリア内の凡例の表示位置を自動調整するオプションです。凡例の表示位置はhalignとvalignオプションで細かく指定できますが、データを変えるたびにマーカーと重ならないように調整するのは面倒なので、このオプションは必須かと思います。

マーカーと凡例が重ならないようにautoalign=autoだと凡例はプロットエリアの中心に置かれてしまうので、通常は表示位置を制限をかけて使っています。表示位置はTOPRIGHT, TOP, TOPLEFT, BOTTOMLEFT, RIGHT, CENTER, LEFT, BOTTOMRIGHT, BOTTOM, BOTTOMRIGHTの9か所から選択でき、これらをリスト形式で指定します。

例として以下の作図を紹介します。この設定の場合だと凡例は本来左下に配置されます。しかしマーカーが左下にあり凡例の表示スペースがないため、凡例の表示位置は自動的に2番目に指定した左上に表示されます。マーカーが重ならないように自動調整してくれるので便利です。

proc template; 
define statgraph discretelegend; 
begingraph; 
layout overlayequated / 
   equatetype=square; 

   scatterplot x=petallength y=petalwidth / 
      group=species 
      name="scatter"; 

   discretelegend "scatter" / 
      location=inside 
      autoalign=(bottomleft topleft); 
  endlayout; 
endgraph; 
end; 

proc sgrender data=sashelp.iris template=discretelegend; 
run;
autoalignを設定した結果

locationオプション

凡例をプロットエリア外に配置する場合はlocation=outsideを、プロットエリア内に配置する場合はlocation=insideを指定します。プロットエリア外に設置する場合はhalignとvalignオプションで表示位置を指定したほうが良いでしょう。表示位置の指定はautoalignと同様のキーワードを使用します。

discretelegend "scatter" / location=outside valign=top halign=right;
location=outside

acrossオプション

凡例の要素が複数あるときに改行して複数行としたい場合がありますが、acrossオプションを使用すると一行あたりの要素数を指定することができます。across=2とすると1行あたりの要素は2つまでとなり、それ以降の要素は改行して表示されます。

以下の例ではacross=1を指定しています。この場合1行あたりの要素は1つのみとなるため、各要素を縦積みして表示することができます。表示スペースの都合上このオプションを指定したほうが良いときもあるので覚えておくと便利だと思います。

discretelegend "scatter" / location=inside autoalign=(topleft topright) across=1;
across=1