引子: 有朋友在QQ群上问道的一个问题,这种图有个名称叫份额图(share charts),比较有代表性。注意这个是等宽的,还有种不等宽的叫mekko图。
已有临床试验数据集bylw.dose6631,一共19893条观察值, 变量有 pid、 time、 group1 、dosegroup, 分别表示病人的id号、时间点(4,8,12)、组类型(对照和干预组)和剂量类型(1,2,3)。
这时很想知道知道使用样本的构成情况,很显然用下面代码很好搞定:
libname bylw "D:\SAStem";
proc gchart data=bylw.dose6631;
vbar group1/
discrete type=pct group=time subgroup=dosegroup inside=subpct g100 width=12;
run;
quit;
得到的图如下:
原始图表

这个胚图真够丑的,这个暂且不论。
我们的目标图要类似这样的
目标图表
当然这个还是有点丑。丑归丑,你会发现你翻烂了SAS help文档,试过了所有的proc gchart的option,最终发现还是做不了。
小结:
这个时候,说明直接画这种统计图是行不通的,尽管gchart本身除了画图,内置了一些统计功能,但是他得到的数据图形也遵循统计学的原则。例如time=4是的干预组的总样本数是大于对照组的,所以干预组的柱形图高于对照组的。这个是完全合情合理的。
转换思路:
但是现在我们需要把所有的柱形图高度调到一致,并且纵坐标为0-100的百分比刻度。这个时候,我们需要采取间接的方法。那就是1,用专门的统计过程得到分析结果数据;2,用结果数据来画图。对于本文,使用如下代码:
proc freq data=bylw.dose6631;
table time*group1*dosegroup/
nocum nopercent OUTPCT out=bylw.count ;
run;
得到数据集bylw.count:
Obs time group1 dosegroup COUNT PERCENT PCT_TABL PCT_ROW PCT_COL
频数统计 总频数百分比 双向表频数百分比 行频数百分比 列频数百分比
1 4 对照 1 313 1.5734 4.7203 11.0445 44.1467
2 4 对照 2 1229 6.1781 18.5342 43.3663 44.5451
3 4 对照 3 1292 6.4947 19.4842 45.5893 40.8473
4 4 干预 1 396 1.9906 5.9719 10.4293 55.8533
5 4 干预 2 1530 7.6911 23.0734 40.2950 55.4549
6 4 干预 3 1871 9.4053 28.2160 49.2757 59.1527
7 8 对照 1 346 1.7393 5.2179 12.2089 48.8701
8 8 对照 2 1155 5.8061 17.4182 40.7551 44.4744
9 8 对照 3 1333 6.7008 20.1025 47.0360 40.0782
10 8 干预 1 362 1.8197 5.4592 9.5338 51.1299
11 8 干预 2 1442 7.2488 21.7463 37.9774 55.5256
12 8 干预 3 1993 10.0186 30.0558 52.4888 59.9218
13 12 对照 1 316 1.5885 4.7655 11.1503 47.7341
14 12 对照 2 1160 5.8312 17.4936 40.9315 47.9141
15 12 对照 3 1358 6.8265 20.4796 47.9181 38.2751
16 12 干预 1 346 1.7393 5.2179 9.1125 52.2659
17 12 干预 2 1261 6.3389 19.0167 33.2104 52.0859
18 12 干预 3 2190 11.0089 33.0267 57.6771 61.7249
SAS的统计数据就是全面啊, 为了让每一个二级组的和为100%,那就选PCT_ROW这组数据。下面根据这组数据画图:
/* Angle the label for the response axis */
axis2 label=(angle=90 '历年传播途径构成比(%)' )
minor=none ;
proc gchart data=bylw.count;
vbar group1/discrete subgroup=dosegroup group=time g100
sumvar=pct_row
inside=sum
width=12 raxis=axis2 ;
run;
quit;
得到预期图表
毛胚图
显然这个图基本上达到了预期的要求。但是太难看了,主要:1,各部分的比例;2,颜色搭配。下面进入漫长的调图期,要画得一张美图,需要花时间的,就像“这个世界上只有懒女人,没有丑女人”一样的道理。
微调了一下,有所改观,还可以继续调整。
成品图

代码:
/* Set the graphics environment */
goptions reset=all hsize=8 vsize=4.5 cback=white htext=13pt;
/* pattern 设置各组的颜色; */
pattern1 v=solid color=cx3F41D5; /* reddish color */
pattern2 v=solid color=cx589DEF; /* this is the hex rgb color for mild blue */
pattern3 v=solid color=cxA0C5F1; /* kind of a seafoam green */
/* 横坐标 */ /*axis1 label=none value=none; */
/* 纵坐标 */
axis2 label=(angle=90 ‘药物临床试验样本构成比(%)’ ) minor=none ;
proc gchart data=bylw.count;
vbar group1/discrete subgroup=dosegroup group=time g100
sumvar=pct_row inside=sum noframe
width=10 SPACE=6 raxis=axis2
/* gaxis=axis1 */
;
run;
quit;