SAS

SAS PlotterでRidgeline plotを作図する

「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。
このページではSAS Plotter version 1.3 でRidgeline plotを作成する方法を解説します。

version 1.3からインストール方法が変更になりました。詳細は以下のページをご参照ください。

SAS Plotterの使用方法「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。 このページではSAS Plotter Ver...

Ridgeline plotとは

Ridgeline plotまたはjoy plotは応答変数の分布をグループごとにプロットする作図手法です。

分布はカーネル密度推定で推定した密度をプロットすることで表現します。
またrugplotを併用することで個別データの可視化も可能です。

Rではggplot2を使った作図例が多数紹介されています。

Ridgelineマクロの使用方法

SAS Plotterでは%Ridgelineマクロを使用することで作成できます。
さらに各種記述統計量の表示も可能です。

Input data

 

key変数変数タイプ
1カテゴリ変数数値または文字列
2群変数数値または文字列
応答変数数値

群変数は任意です。群変数とカテゴリ変数は文字列型でも動作しますが、その場合はテキストの昇順でグループの表示順を決定します。
順番を定義したい場合はフォーマットを適用した数値変数を使用することを推奨します。

文法

ods graphics / < graphics option > ;
ods listing gpath=< output path >;

%macro ridgeline(
   data=,
   x=,
   y=,
   group=None,
   xlabel=x,
   ylabel=y,
   yticks=,
   cat_iv = 1.2,
   gridsize = 401,
   bw_method = sjpi,
   bw_adjust = 1,

   quartile=False,
   mean=False,

   legend = False,
   grouplegendtitle=group,

   rug = False,
   ruglength = 2,

   fillstyle=None,
   qgradient=1,
   palette=sns,
   note=,
   deletedata=True);

パラメータ

data : データセット(必須)

入力データ。rename, whereオプションを併用できます。

x : 変数(必須)

カテゴリ変数

y : 変数(必須)

応答変数

group : 変数(任意)

群変数。xオプションと同じ変数を指定すると、各グループはそれぞれ別の色で塗り分けられます。指定しない場合はすべてのオブジェクトは同じ色になります。デフォルト=None

xlabel : テキスト(任意)

カテゴリ軸のラベル。デフォルトはx変数のラベル。以下のように設定するとラベルは非表示となります。xlabel=,

ylabel : テキスト(任意)

応答変数軸のラベル。デフォルトはy変数のラベル。以下のように設定するとラベルは非表示となります。ylabel=,

yticks : リスト(必須)

応答変数軸の目盛りを指定できます。半角スペースで区切られた数値リストを指定してください。数値は昇順で指定する必要があります。(例)yticks = 10 20 30 40,

cat_iv : 数値(任意)

各カテゴリの間隔。デフォルトは1.2。1未満にするとグラフ同士が重なる可能性があります。

gridsize : 数値(任意)

KDEのグリッド数。デフォルトは401(proc kdeのデフォルト値)

bw_method : キーワード(任意)

KDEのバンド幅推定方法を指定します。デフォルトはsjpi(proc kdeのデフォルト値)。利用可能な推定方法は以下の通りです。

  • sjpi (Sheather-Jones plug-in)
  • snr (simple normal reference)
  • snrq (simple normal reference that uses the interquartile
    range)
  • srot (Silverman’s rule of thumb)
  • os (oversmoothed)

bw_adjust : 数値(任意)

バンド幅のファクター。この値を大きくすると密度はより滑らかになります。デフォルトは1。

quartile: 真偽値(任意)

Trueにすると四分位線を表示します。デフォルトはFalse。

mean: 真偽値(任意)

Trueにすると平均線を表示します。デフォルトはFalse。

legend : 真偽値(任意)

Trueを指定すると凡例を表示します。groupオプションを”None”を指定するとこの引数は無視されます。 デフォルトはFalse。

grouplegendtitle : テキスト(任意)

groupパラメータで指定した群の凡例タイトルを指定します。LegendパラメータがTrueではない場合は無視されます。デフォルトはgroup変数のラベル。

fillstyle : キーワード(任意)

塗りつぶし設定を変更できます。以下のキーワードのいずれかを指定できます。デフォルトはNone(塗りを設定しない)。

  • None: 塗りつぶしを非表示にします。
  • Group: groupパラメータで指定した変数に基づいて密度プロットを塗りつぶします。
  • Quartile: 密度プロットを4分位点ごとに分割して塗りつぶします。

qgradient : 1から7までの整数(任意)

Fillstyleパラメータでquartileを指定した場合、四分位のカラーグラジエントパターンを指定できます。現在は7種類のグラジエントパターンが登録されており、IDを指定することで切り替えることができます。デフォルトは1。

なお利用できるカラーグラジエントは以下の通りです。

カラーグラジエント一覧

rug : 真偽値(任意)

Trueを指定するとrugplotを表示します。デフォルトはFalse。

ruglength : 数値(任意)

rugplotの長さを制御します。値を大きくするとrugplotを伸ばします。
rugオプションをFalseに指定した場合はこのオプションは無視されます。
デフォルトは1。

palette : キーワード (オプション)

塗り、ライン、マーカーのカラーパレット、以下のパレットが利用可能です。デフォルトはSNS(seabornのデフォルトパレット)

  • SAS
  • SNS (Seaborn)
  • STATA
  • TABLEAU

note : ステートメント(オプション)

グラフテンプレートにentryステートメントを挿入し、グラフタイトルまたはフットノートを表示します。デフォルトは””(表示しない)

deletedata : 真偽値(オプション)

マクロが作成した一時データを削除します。デフォルトはTrue(一時データを削除する)。

作図例

作図例はgithubのexample内にsasプログラムを格納しています。filenameステートメントを使えばすぐに実行できます。

ods listing gpath=<your output path>; 
filename exam url "https://github.com/Superman-jp/SAS_Plotter/raw/main/example/ridgeline_example.sas" 
encoding="UTF-8"; 

%include exam;

シンプルなridgeline plot

東京と那覇の日中最高気温のデータを用いてridgeline plotを作成してみます。

data raw;
infile datalines delimiter=',';
length col1 $10;
format date yymmdd10.;
input col1 $  tokyo  naha ;
date = input(col1,yymmdd10.);
drop col1;

datalines;
2023/1/1,13,19.8
2023/1/2,12.1,19.4
2023/1/3,11,21.4
2023/1/4,11,19.5
2023/1/5,10.6,20.4
2023/1/6,9.9,21.7
2023/1/7,10.4,19.4
2023/1/8,12.5,21.2
2023/1/9,13.9,22.5
2023/1/10,9.9,22.8
2023/1/11,10.7,23.3
2023/1/12,12.6,24.3
2023/1/13,14,25.4
2023/1/14,14.2,25.3
2023/1/15,12,22.6
2023/1/16,7.7,17.9
2023/1/17,7.6,19.1
2023/1/18,12.4,17.9
2023/1/19,9.1,18.6
2023/1/20,12.3,18.7
2023/1/21,9,20.7
2023/1/22,8.9,24.1
2023/1/23,6.1,22.7
2023/1/24,11.8,20.2
2023/1/25,3.7,15.5
2023/1/26,8.5,20.6
2023/1/27,6.6,17.5
2023/1/28,8.3,14.8
2023/1/29,8.8,16.1
2023/1/30,10,16.6
2023/1/31,9,19.5
2023/2/1,13.1,23.2
2023/2/2,9.2,21.6
2023/2/3,6.2,19.8
2023/2/4,11.2,18.6
2023/2/5,12,21.3
2023/2/6,13.6,22.7
2023/2/7,15.4,22.9
2023/2/8,11.7,22.9
2023/2/9,10.6,23
2023/2/10,3.5,23.6
2023/2/11,14.1,22.8
2023/2/12,16.9,25
2023/2/13,10.3,25.6
2023/2/14,10.7,19.9
2023/2/15,7.8,17.2
2023/2/16,9.6,21.2
2023/2/17,10.8,22.5
2023/2/18,15,23.6
2023/2/19,18.5,24.2
2023/2/20,14.7,19
2023/2/21,9.2,19.1
2023/2/22,10.4,22.1
2023/2/23,14.4,23.2
2023/2/24,12.1,23.5
2023/2/25,12.7,19.4
2023/2/26,10.7,17.9
2023/2/27,15,18.3
2023/2/28,19.4,21.8
2023/3/1,19.4,23.5
2023/3/2,20,19.2
2023/3/3,13.4,18.1
2023/3/4,17.4,20.9
2023/3/5,13.1,21.1
2023/3/6,15,21.1
2023/3/7,18.8,22
2023/3/8,21.3,23.9
2023/3/9,22.2,24
2023/3/10,22.9,22.9
2023/3/11,20.8,24.3
2023/3/12,18.8,24
2023/3/13,16.7,19.3
2023/3/14,14.6,20.7
2023/3/15,17.9,24.1
2023/3/16,20.9,24.5
2023/3/17,15.1,24.8
2023/3/18,9.5,22.8
2023/3/19,15.5,22.9
2023/3/20,19.2,21.7
2023/3/21,18.5,25.9
2023/3/22,23.8,26.3
2023/3/23,19.7,26.9
2023/3/24,25,27.3
2023/3/25,14.1,22.9
2023/3/26,12.5,20.3
2023/3/27,16.9,21.7
2023/3/28,13.4,23.9
2023/3/29,18.6,23.1
2023/3/30,19.7,23.2
2023/3/31,20.1,24.4
2023/4/1,23.3,24.3
2023/4/2,19,23.8
2023/4/3,18.4,25.2
2023/4/4,21,25
2023/4/5,21.8,24.7
2023/4/6,23.4,25.9
2023/4/7,21.3,23.8
2023/4/8,21.1,20.8
2023/4/9,17.7,21.9
2023/4/10,21.6,23.7
2023/4/11,25,26.3
2023/4/12,24.5,26.4
2023/4/13,21.3,24.9
2023/4/14,22.5,26.5
2023/4/15,18,26
2023/4/16,24.5,27.2
2023/4/17,20.3,28.7
2023/4/18,21,27.1
2023/4/19,24.9,26.5
2023/4/20,26,25.8
2023/4/21,26.8,26.2
2023/4/22,18.4,25.2
2023/4/23,20.5,25.8
2023/4/24,16,26.2
2023/4/25,19.1,27.1
2023/4/26,19.7,22.3
2023/4/27,23.8,24.4
2023/4/28,24.1,27
2023/4/29,23.8,28.4
2023/4/30,22,25.3
2023/5/1,22.5,24.6
2023/5/2,23,25.4
2023/5/3,23.4,25.8
2023/5/4,25.7,27.4
2023/5/5,26.6,27.5
2023/5/6,27.9,28.1
2023/5/7,22.3,26.6
2023/5/8,16.6,23.4
2023/5/9,20.6,25
2023/5/10,25,25.4
2023/5/11,23.4,25.7
2023/5/12,21.9,26.1
2023/5/13,18.1,26.6
2023/5/14,21.2,23.5
2023/5/15,18.1,25.3
2023/5/16,27.5,28.2
2023/5/17,31.6,27.6
2023/5/18,32.2,27.8
2023/5/19,24.5,27
2023/5/20,22.8,27
2023/5/21,26.3,27.4
2023/5/22,29.4,28.5
2023/5/23,17.2,25.2
2023/5/24,23.9,26.4
2023/5/25,23.8,28
2023/5/26,24.9,27.6
2023/5/27,26.7,27.3
2023/5/28,25.8,27.8
2023/5/29,21.3,30
2023/5/30,26.3,29.4
2023/5/31,22.2,29.6
2023/6/1,26.2,26.6
2023/6/2,23.8,26.5
2023/6/3,24,27.7
2023/6/4,27.5,29.3
2023/6/5,29.8,30.5
2023/6/6,25.1,29.1
2023/6/7,29.6,30.1
2023/6/8,28.7,29.9
2023/6/9,22.2,31.2
2023/6/10,26,30.2
2023/6/11,22.8,30.9
2023/6/12,22.5,29.4
2023/6/13,29.4,28
2023/6/14,25.8,25.8
2023/6/15,24.1,28
2023/6/16,30.7,28.5
2023/6/17,30.9,27.6
2023/6/18,31.1,30.3
2023/6/19,27.7,28.1
2023/6/20,27,30
2023/6/21,27.2,30.5
2023/6/22,22.6,29.9
2023/6/23,24.9,30.2
2023/6/24,29.5,31.9
2023/6/25,30.9,31.4
2023/6/26,30.4,31.5
2023/6/27,29.6,31.7
2023/6/28,32.3,30.7
2023/6/29,33.8,32.8
2023/6/30,30.5,32.3
2023/7/1,27.8,32
2023/7/2,31.7,32.5
2023/7/3,32.2,32.7
2023/7/4,30.6,32
2023/7/5,28.7,32.3
2023/7/6,33.4,32.6
2023/7/7,34.2,33.3
2023/7/8,30.9,32.8
2023/7/9,33,33.5
2023/7/10,36.5,34.1
2023/7/11,34.3,33.8
2023/7/12,37.5,34.2
2023/7/13,30.3,33.9
2023/7/14,30.5,33.7
2023/7/15,32.9,32.8
2023/7/16,35.3,32.7
2023/7/17,36.2,31.5
2023/7/18,37.5,32.8
2023/7/19,33.9,33.1
2023/7/20,32.6,33
2023/7/21,31.6,33.9
2023/7/22,33.4,33.9
2023/7/23,33.4,34.3
2023/7/24,35.7,33.2
2023/7/25,36.6,32.9
2023/7/26,37.7,31.3
2023/7/27,36.9,29.6
2023/7/28,36.2,32
2023/7/29,35.7,32.3
2023/7/30,36.6,32.6
2023/7/31,36.1,30.9
;
run;

proc format ;
value regionf
1="Tokyo"
2="Naha";
run;

data max_temp;
set raw;
format region regionf.;
label max_temp="maximum temperature (degree Celsius)"
      month="Month"
   region="Region";

month=month(date);
year=year(date);
region=1; max_temp=tokyo;output;
region=2; max_temp=naha; output;
keep year month  date region max_temp;
run;

まずはシンプルなrigelineプロットを作成してみます。

title "basic ridgeline plot";
ods graphics / height=15cm width=15cm imagefmt=png imagename="ridge_simple" ;
%ridgeline(
   data=max_temp(where=(region=1)),
   x=month,
   y=max_temp,

   yticks=0 5 10 15 20 25 30 35 40,
   note=%nrstr(entrytitle 'your title here';
            entryfootnote halign=left 'your footnote here';
            entryfootnote halign=left 'your footnote here 2';)
               );
基本的なridgeline plot

グループ毎に表示

groupパラメータを指定すると塗りつぶしが利用できます。fillstyleパラメータを設定しない場合はグループに応じて線の色が変わります。塗りを適用する場合はfillstyleパラメータをgroupに変更します。

title "grouped ridgeline plot";
ods graphics / height=15cm width=25cm imagefmt=png imagename="ridge_group" ;
%ridgeline(
   data=max_temp,
   x=month,
   y=max_temp,
   group=region,
   yticks=0 5 10 15 20 25 30 35 40,
   legend=true
   );
群別ridgeline plot

記述統計量および個別値の表示

平均値と4分位点の表示をサポートしています。四分位点は点線、平均値は実線で表現されます。ラグプロットを使用すれば個別値の表示も可能です。

ods graphics /reset=all height=15cm width=25cm imagename="ridgeline_stat" imagefmt=svg;
ods listing gpath="<output path>";

%ridgeline(
   data=tokyo_naha_temp(where=(month in(1:6) and region=1)),
   x=month,
   y=max_temp,
   group=region,
   xlabel=month,
   ylabel=maximum temperature (℃),
   yticks=0 5 10 15 20 25 30 35 40,
   grouplegendtitle=Region,
   legend=true,
   mean=true,
   quartile=true,
   rug=true
   );
統計量と個別値を表示したridgeline plot

塗りスタイル

密度プロットの塗りスタイルは非表示、グループ、4分位の三つをサポートしています。

グループと4分位はgroupパラメータを設定した場合のみ使用可能です。

title "ridgeline plot with fill style";
ods graphics /reset=all height=15cm width=25cm imagename="ridgeline_fill" imagefmt=png;

%ridgeline(
   data=max_temp,
   x=month,
   y=max_temp,
   group=region,
   yticks=0 5 10 15 20 25 30 35 40,
   fillstyle=group,
   legend=true,
   mean=false,
   quartile=true,
   rug=true
   );
塗りを適用したridgeline plot
title "ridgeline plot with quartile style";
ods graphics /reset=all height=15cm width=25cm imagename="ridgeline_qtr" imagefmt=png;

%ridgeline(
   data=max_temp (where=(region=1)),
   x=month,
   y=max_temp,
   group=region,
   yticks=0 5 10 15 20 25 30 35 40,
   fillstyle=quartile,
   legend=true,
   mean=false,
   quartile=true,
   rug=true
   );
四分位ごとに色分けしたridgeline plot