使用Sas 9.3我正在尝试基于某个交叉表进行堆叠条形图。我知道,如何用9.4做到这一点,但在9.3中我看起来要困难得多。
假设我有一个这样的交叉表(宽泛的形式):
group v1_0 v1_1
A 12 88
B 17 83
C 29 71
如您所见 - 行总计为100。
或者,我可以长篇大论:
group v1 val
A 0 12
A 1 88
B 0 17
B 1 83
C 0 29
C 1 71
我试过了,其中包括:
proc sgplot data=long_form_data;
vbar val / groupdisplay=stack group=group response=v1;
run;
但它没有产生任何合理的东西。
我会感激任何帮助。提前谢谢。
编辑:
9.4代码看起来可能是这样的:
proc sgplot data=long_form_data pctlevel=group;
vbar val / groupdisplay=stack group=group response=v1;
run;
使用Excel制作的相同图表如下所示:
答案 0 :(得分:1)
vbar
的第一个参数是类别,而不是值。所以你有这种倒退。
这与9.3到9.4并没有什么不同,尽管9.4有一些更好的选项来标记条形。
data have;
input group $ v1 val;
datalines;
A 0 12
A 1 88
B 0 17
B 1 83
C 0 29
C 1 71
;;;;
run;
proc sgplot data=have;
vbar group/response=val group=v1 groupdisplay=stack;
run;
还有其他方法可以做到这一点;你可以阅读我的论文Labelling without the hassle了解其他一些方法,包括使用GTL。
如果条形标签对您很重要,那么请阅读上面的论文 - 这就是它的含义。最简单的方法是使用高低条和散点图。 (遗憾的是,你不能在VBAR上叠加散点图,而VBARPARM在9.3中也不允许堆叠。)
*Create a dataset with yMin and yMax being bottom/top of each bar segment;
*yScatter is the midpoint of each bar segment, location to put the label;
data have_highlow;
set have;
by group v1;
if first.group then _yBase=0;
yMin = _yBase;
yMax = val + _yBase;
yScatter = (val/2) + _yBase;
output;
_ybase+val;
run;
proc SGPLOT data=have_highlow;
*Here is the bar chart (which is a highlow chart plotting each segment);
highlow x=group low=yMin high=yMax/
type=bar barwidth=0.6 group=v1
groupdisplay=overlay;
*Need to use discreteoffset to center the label (this is a bit messy);
scatter x=group y=yScatter/ discreteoffset=-0.08
markerchar=val markercharattrs=
(size=18pt color=white);
run;