「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。
このページではSAS Plotter version 1.3 でRidgeline plotを作成する方法を解説します。
version 1.3からインストール方法が変更になりました。詳細は以下のページをご参照ください。
- Ridgeline plotとは
- Ridgelineマクロの使用方法
- Input data
- 文法
- パラメータ
- data : データセット(必須)
- x : 変数(必須)
- y : 変数(必須)
- group : 変数(任意)
- xlabel : テキスト(任意)
- ylabel : テキスト(任意)
- yticks : リスト(必須)
- cat_iv : 数値(任意)
- gridsize : 数値(任意)
- bw_method : キーワード(任意)
- bw_adjust : 数値(任意)
- quartile: 真偽値(任意)
- mean: 真偽値(任意)
- legend : 真偽値(任意)
- grouplegendtitle : テキスト(任意)
- fillstyle : キーワード(任意)
- qgradient : 1から7までの整数(任意)
- rug : 真偽値(任意)
- ruglength : 数値(任意)
- palette : キーワード (オプション)
- note : ステートメント(オプション)
- deletedata : 真偽値(オプション)
- 作図例
- 専用フォーラム
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';)
);
グループ毎に表示
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
);
記述統計量および個別値の表示
平均値と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
);
塗りスタイル
密度プロットの塗りスタイルは非表示、グループ、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
);
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
);
専用フォーラム
要望、バグ報告は以下のフォーラムをご利用ください