今回もフォレストプロットの話です。
前回の記事はこちら
フォレストプロットの作図例を見るとサブグループの行だけグループ名にインデントを挿入して見やすくしているものがあります。
インデントを挿入するには列データにインデントを直接挿入する方法もありますが、axistableステートメントにはインデントを挿入するオプションがあります。
公式ブログで公開されているけど・・・
フォレストプロットの作図方法は以下の記事にて公開されています。
またSAS社コンサルタントであるlexjansen氏の発表でforestplotの作図方法が紹介されています。
SASの公式ブログではフォレストプロットの作図例がいくつか公開されているのですが、highlowplotやscatterplotでテーブルを作成しています。
この作図はhighlowプロットとscatterplotを使って作成しています。たぶん古いバージョンでも動作するように設計しているのでしょう。(highlowplotって古いバージョンでも動くのでしょうか?)古いバージョンの場合この方法でOKですが、SAS9.4ならhighowplotは必要ありません。
またSASブログの方はサブグループの各水準の文字列に直接インデントを挿入していますが、これもaxistableであれば必要ありません。データセットを加工してインデントの挿入する手間は不要です。
わざわざデータセットの文字列を加工すると後で別の作図に流用したいときにまた手を加えなければならなくなります。
axistableのみでインデントを再現する
同じフォレストプロットをaxistableとscatterplotステートメントで作図してみました。プロットエリア内のテキスト表示はtextplotステートメントを使用しましたが、scatterplotプロットでも同じことができます。
作図データ
変数 | 説明 |
---|---|
ID | フォレストプロットの各行を識別する番号、上の行から連番を振る。axistableとscatterplotのY変数として使う |
Mean | ハザード比 |
lower | 信頼下限 |
upper | 信頼上限 |
COL1 | サブグループ名 または水準名 |
COL2 | 患者数と割合 |
COL3 | PCIgroupの累積イベント発生率 |
COL4 | groupの累積イベント発生率 |
COL5 | P値 |
indent | 水準名のレコードは1を、サブグループ名のレコードは0を格納する |
fill | 塗りを適用したいレコードの場合、IDを格納する |
text | プロット中にテキストを配置する。今回は一番下に空のレコードを挿入し、 そこにテキストを2つ配置する(PCIbetter, Thrapy better) |
x | テキストの配置位置(X座標) |
作図コード
proc template; define statgraph forest3;
begingraph;
discreteattrmap name="group";
value "0" / textattrs=(weight=bold); /* code 1*/
enddiscreteattrmap;
discreteattrvar attrmap="group" var=indent attrvar=_grp;
layout lattice / rows=2 rowweights=(3 97);
entry halign=right "4-Yr cumulative event rate" / pad=(right=5) textattrs=(size=10 weight=bold);
/* code 2*/
layout overlay / walldisplay=none
yaxisopts=(type=discrete reverse=true display=none)
xaxisopts=(linearopts=(viewmin=0 viewmax=2)
display=( ticks line tickvalues)
displaysecondary=(line label) /* code 3*/
label="Hazard ratio"
labelattrs=(size=10));
innermargin / align=left;
axistable y=ID value=COL1 /
indentweight=indent
textgroup=_grp
labelattrs=(size=10)
valueattrs=(size=10) ;
/* code 4*/
axistable y=ID value=COL2 /
labelattrs=(size=10)
valueattrs=(size=10);
endinnermargin;
referenceline y=fill /
lineattrs=(thickness=18 color=cxf0f0f7);
/* code 5*/
scatterplot x=mean y=ID /
/* code 6*/
xerrorlower=lower
xerrorupper=upper
errorbarcapshape=none
markerattrs=(symbol=squarefilled color=cx003399)
errorbarattrs=(color=cx003399);
referenceline x=1;
textplot x=x y=ID text=text /
textattrs=(size=10 weight=bold);
/* code 7*/
innermargin / align=right;
axistable y=ID value=COL3/
labelattrs=(size=10 )
valueattrs=(size=10)
valuejustify=center;
/* code 8*/
axistable y=ID value=COL4/
labelattrs=(size=10)
valueattrs=(size=10)
valuejustify=center;
axistable y=ID value=COL5/
labelattrs=(size=10 )
valueattrs=(size=10)
valuejustify=center;
endinnermargin;
endlayout;
endlayout;
endgraph;
end;
run;
ods graphics /width=20cm height=15cm;
proc sgrender data=raw2 template=forest3;
run;
実行結果
解説
作図コードのうちCode1~Code7についての解説です。
Code 1
attributemapでサブグループの文字列のフォントを設定します。サブグループ名は太字で表示されるようにしました。ただしフォントサイズは指定できません。
Code2
layout latticeステートメントでグラフエリアを2行に分割し、一行目にプロット右側列のタイトルを設置します。
Code 3
displaysecondaryオプションでlabel表示を有効にするとプロットの上側にラベルを設置できます。これを利用しプロットのタイトルを設置します。
Code 4
indentweightオプションで指定した変数に1が格納されている場合、サブグループ名は1段階のインデントが挿入されます。textgroupオプションでcode1で作成したattributemapを指定することで、サブグループ名(インデントされていない)は太字になります。
Code 5
変数fillに格納されたY軸の値のみ塗りが適用されます。
Code6
scatterplotでドットプロットを作成します。errorbarcapshapeオプションでnoneを指定するとエラーバーの先端はラインのみとなります。
Code7
textplotでプロット内にテキストを配置します。