程序如下:
- data _forest;
- input group1 $1-34 group2 $35.OR LowerCL UpperCL ;
- datalines;
- Age 0.999 0.992 1.006
- BMI 0.953 0.929 0.976
- Gender (Female) 0.640 0.526 0.777
- Gender Male (control) . . .
- Diabetes Yes 1.120 0.956 1.311
- Diabetes No (control) . . .
- Hypertension Yes 1.079 0.903 1.294
- Hypertension No (control) . . .
- Smoking status (Past smoker) 0.935 0.768 1.138
- Smoking status (Current smoker) 0.714 0.571 0.892
- Smoking status Non smoker (control) . . .
- Dyslipidemia Yes 0.577 0.497 0.668
- Dyslipidemia No (control) . . .
- lipid lowering therapy Yes 3.540 2.879 4.388
- lipid lowering therapy No (control) . . .
- ;
- run;
- data _forest2;
- length name1 $70.;
- set _forest;
- if group2^="Yes" then name1=strip(group1)||" "||strip(group2);
- else name1=strip(group1);
- if or=. then delete;
- or1='OR(95%CI)';
- CI=right(strip(PUT(OR,best.))||"("||strip(PUT(LowerCL,best.))||", "||strip(PUT(UpperCL,best.))||") ");
- run;
- *用于加annotation,出来的效果要自己酌情调整;
- data _f9_anno;
- length function $4 color style $20 label $40;
- retain width 40;
- function="text";
- color="black"; style="'Times New Roman'";
- xsys='3'; x1=58;
- ysys='3'; y1=98;
- label='Hazard Ratio and 95% CI';
- output;
- run;
- proc sgplot data=_forest2 sganno=_f9_anno noautolegend;
- scatter y=name1 x=or / xerrorupper=UpperCL xerrorlower=LowerCL
- markerattrs=graphdata1(symbol=squarefilled size=3);
- scatter y=name1 x=or1 / markerchar=CI x2axis ;
- /* scatter y=name1 x=or2 / markerchar=group1 ;*/
- refline 1 / axis=x lineattrs=(pattern=shortdash) transparency=0.5;
- inset 'Goal unachieved' / position=bottomleft;
- inset 'Goal achieved' / position=bottom;
- xaxis type=log offsetmin=0 offsetmax=0.35 min=0.1 max=5
- minor display=(nolabel) ;
- x2axis offsetmin=0.7 offsetmax=0.01 display=(noticks nolabel);
- yaxis display=(noticks nolabel) offsetmin=0.071 offsetmax=0.035;
- run;
xerrorupper& xerrorlower 功能同yerrorupper和yerrorlower,只是一个是Y轴的上下限,一个是X轴的,symbol决定图标样式,size决定图标大小。markerchar和x2axis用于添加次级X轴的值。Refline用于指定中心,此图以1为中心,画虚线分隔,设置虚线透明度。Inset语句就是添加类似label的语句,可以调节位置。
此处几个offset语句,是用于调节X轴和Y轴的位置的,offsetmin,离左边的距离,offsetmax,离右边的距离,0.35,0.1都是距离的百分比。