我有这样的数据:
var1 target
1.2 X
2 Y
2.3 Z
我想用百分比叠加直方图,看起来像这样:
图表可以叠加,只要它们是比较的。我试过这个,但它不起作用:
proc univariate data=mydata;
var var1;
by target;
histogram;
run;
答案 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"