堆积的条形图与百分比

时间:2016-05-11 14:07:09

标签: sas

使用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制作的相同图表如下所示:

Example chart

1 个答案:

答案 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;