散布図はデータを可視化する最も基本的な作図です。GTLは従来の散布図に加えて様々なオプションを併用することで多様な散布図が作成可能です。
scatterplotステートメント
scatterplotステートメントはプロットエリアの任意の座標にマーカーシンボルを表示し、散布図やドットプロットを作成するステートメントです。
scatterplot x=< x variable > y=< y variable > /;
x軸変数とy軸変数を指定するだけで作図が可能ですが、オプションを組み合わせることで様々な散布図を作成できます。
使用できるオプション
グループ毎にマーカーを切り替える
groupオプションで群変数を指定することでグループごとにマーカーを切り替えることができます。
使用するマーカーの種類、色といった属性はデータの順番に依存しますが、discrete attribute mapを使用することでデータごとに使用する属性を指定することができます。
以下の例では、身長と体重の散布図を作成しています。groupオプションで性別(変数SEX)を指定することで、性別ごとにマーカーを切り替えて表示しています。
proc template;
define statgraph scatterplot;
begingraph;
layout overlay;
scatterplot x=height y=weight /
group=sex
markerattrs=(symbol=circlefilled)
name="scatter";
discretelegend "scatter";
endlayout;
endgraph;
end;
run;
proc sgrender data=sashelp.class template=scatterplot;
run;
データラベルを表示する
datalabelオプションでラベル変数を指定することで、データラベルをマーカーと共に表示できます。datalabelpositionオプションでデータラベルの表示位置(AUTO , TOPRIGHT , TOP , TOPLEFT , LEFT , CENTER , RIGHT , BOTTOMLEFT , BOTTOM , BOTTOMRIGHTのいずれか) を設定できます。
以下の例では、被験者の名前をデータラベルとして表示しています。
proc template;
define statgraph scatterplot;
begingraph;
layout overlay;
scatterplot x=height y=weight /
group=sex
markerattrs=(symbol=circlefilled)
datalabel=name
name="scatter";
discretelegend "scatter";
endlayout;
endgraph;
end;
run;
proc sgrender data=sashelp.class template=scatterplot;
run;
マーカーの代わりにテキストを表示する。
markercharacterオプションに文字列または文字列を格納したデータセットの変数を指定すると、マーカーシンボルの代わりにテキストを配置することができます。なおこのオプションを利用するとdatalabelオプションの設定を上書きします。
テキストのフォント設定はmarkercharacterattrsオプションを、またテキストの配置はmarkercharacterpositionで指定できます。デフォルトでは指定した座標点の中心に配置されるようです。
なおtextplotステートメントでも同じことができますが、こちらのほうが文字列の表示設定をさらに細かく指定できるようです。テキストの装飾を細かく指定したい場合はtextplotステートメントを使用したほうが良いでしょう。
textplot x=< xvariable > y= < y variable > text= < text variable > / < options > ;
以下の例では、都道府県別のPCR検査数と新型コロナウィルスが陽性と判定された人数を散布図として示しています。マーカーの代わりに都道府県名を表示してみました。
都道府県が多いので検査人数に対する陽性患者数の割合が5%を超える都道府県を抽出しています。
proc template;
define statgraph text;
begingraph;
layout overlay/
xaxisopts=(label="検査数" griddisplay=on)
yaxisopts=(label="陽性患者数" griddisplay=on);
scatterplot x=tested y=positive /
markercharacter=label
markercharacterattrs=(size=14);
endlayout;
endgraph;
end;
run;
proc sgrender data=dat template=text;
run;
第3引数の値をグラデーションとして表現する
colorresponseオプションは指定した変数の値の大きさに応じたグラデーションをマーカーに適用できます。colormodelオプションでグラデーションに使用する色を指定することが可能です。
またrange attribute mapでデータとグラデーションを紐づけることも可能です。
以下の例では惑星の距離と公転周期の散布図に、惑星の質量の情報をグラデーションとして追加しています。
proc template;
define statgraph scat2;
begingraph;
layout overlay/
xaxisopts=(type=log)
yaxisopts=(type=log);
scatterplot x=distance y=orbital_period/
colorresponse=mass
colormodel=(lightslategray orange red)
markerattrs=(symbol=circlefilled )
name="scatter";
continuouslegend "scatter";
endlayout;
endgraph;
end;
run;
proc sgrender data=planet template=scat2;
run;
第3引数の値をマーカーサイズとして表現する
markersizeresponseオプションは指定した変数の値に応じてマーカーサイズを変更するオプションです。つまり指定した変数の値が大きいほどマーカーサイズは大きくなります。
フォレストプロットでサンプル数をマーカーサイズとして表現することがありますが、それはmarkersizeresponseオプションを使用すれば作図できます。
markersizemaxオプションでマーカーサイズの最大値を指定できます。
SASではマーカーサイズに対応した凡例は作成することはできません。seabornでは可能のようなので、
この点についてはpythonよりも劣ります。
以下の例では惑星の距離と公転周期の散布図に、惑星の質量の情報をグラデーションおよびマーカーサイズとして追加しています。グラデーションのみよりは見やすくなりました。
proc template;
define statgraph scat2;
begingraph;
layout overlay/
xaxisopts=(type=log)
yaxisopts=(type=log);
scatterplot x=distance y=orbital_period/
colorresponse=mass
colormodel=(lightslategray orange red)
markersizeresponse=mass
markersizemax=24
markerattrs=(symbol=circlefilled transparency=0.3)
name="scatter";
continuouslegend "scatter";
endlayout;
endgraph;
end;
run;
proc sgrender data=planet template=scat2;
run;
エラーバーを追加する
xerrorlowerおよびxerrorupperオプションでx変数のエラーバーの下限および上限を指定することができます。
yerrorlowerおよびyerrorupperオプションでy変数のエラーバーの下限および上限を指定することができます。
フォレストプロットのドットプロットをこのオプションを使用すれば作図できます。
errorbarattrsオプションでエラーバーの線や色を設定できます。errarbarcapshapeオプションはエラーバーのキャップ図形を非表示にするときに使用します。
以下の例はSAS公式で紹介されているサンプルプログラムを若干修正を加えたものです。
errorbarattrsオプションでエラーバーの色を青に設定し、エラーバーのキャップ図形を非表示にしています。
proc summary data=sashelp.class nway;
var height;
class age;
output out=classSum
mean=mean
std=std;
run;
proc template;
define statgraph dotplot;
begingraph;
entrytitle "Mean Height by Age";
layout overlay /
xaxisopts=(label="Height (Mean)")
yaxisopts=(griddisplay=on
gridattrs=(color=lightgray pattern=dot)
reverse=true);
scatterplot x=mean y=age /
name="scatter"
markerattrs=(symbol=circlefilled)
xerrorupper=eval(mean + std)
xerrorlower=eval(mean - std)
errorbarattrs=(color=blue)
errorbarcapshape=none
legendlabel="Height (Mean), 1 Standard Deviation";
discretelegend "scatter";
endlayout;
endgraph;
end;
run;
proc sgrender data=classSum template=dotplot;
where age < 16; run;