如何使用短格式数据创建叠加直方图?

时间:2015-07-30 17:37:51

标签: graph sas histogram

我有这样的数据:

var1  target
1.2   X
2     Y
2.3   Z

我想用百分比叠加直方图,看起来像这样:

Histogram image

图表可以叠加,只要它们是比较的。我试过这个,但它不起作用:

proc univariate data=mydata;
  var var1;
  by target;
  histogram;
run;

2 个答案:

答案 0 :(得分:1)

将它们放在一个小组中非常容易:

data have_data;
  call streaminit(7);
  do _j = 1 to 1e3;
      do _i = 1 to 3;
        target=byte(_i+120);
        var1=rand('Normal',_i,0.5);
        output;
      end;
  end;
run;

proc sgpanel data=have_data;
  panelby target/columns=1;
  histogram var1;
  density var1;
run;

当然,这并没有重叠。覆盖更具挑战性,我认为需要一些额外的步骤。

要做重叠,最简单的选择可能是将var1分成三个变量,每个目标值一个。 (对于其他目标值,它可以为空。)然后在一次SGPLOT调用中创建三个直方图和密度图。

data want;
  set have_Data;
  array vars[3];
  vars[rank(target)-120] = var1;
run;
title;
proc sgplot data=want noautolegend;
  histogram vars1/name='x' legendlabel='x';
  histogram vars2/name='y' legendlabel='y';
  histogram vars3/name='z' legendlabel='z';
  density vars1;
  density vars2;
  density vars3;
  keylegend 'x' 'y' 'z'/position=top;
run;

我认为你也可以使用gtl来做这件事,如果你知道和/或很乐意学习它,因为它允许你叠加直方图,如果需要,我可以嘲笑一些东西。 / p>

答案 1 :(得分:1)

在SAS 9.4m3中,OVERLAY选项已添加到PROC UNIVARIATE中的HISTOGRAM语句中。这意味着您现在可以直接从PROC UNIVARIATE获取您想要的图表:

proc Univariate data=sashelp.iris;
class Species;
var SepalLength;
histogram SepalLength / kernel overlay;
run;

在PROC SGPLOT中,SAS 9.4m2在HISTOGRAM语句中引入了对GROUP =选项的支持。因此,如果您更喜欢PROC SGPLOT,您可以将数据转换为长格式并使用GROUP =选项。

proc sgplot data=sashelp.iris;
histogram SepalLength / group=Species  transparency=0.5;
density SepalLength/ group=Species type=kernel;
run;

有关叠加和镶板直方图的更多信息,请参阅文章"Comparative histograms: Panel and overlay histograms in SAS"