我正在尝试使用SAS宏自动化一个图形处理过程。由于这将用于几个不同的子集,因此必须相应地调整图形的轴。我尝试了几种不同的方法,觉得自己走错了方向。
这是我的数据集。
data want;
input A B C D;
cards;
100 5 6 1
200 5 5 2
150 5.5 5.5 3
457 4.2 6.2 4
500 3.7 7.0 5
525 3.5 7.2 6
;
run;我想要的是一个图,它的轴规格如下:X轴从min(D)到max(D),通过一些合理的增量从min(A)到max(A)从min (B,C)到max(B,C)。
以下是我的最新尝试:
proc sql;
select roundz((max(A)+100), 100),
roundz(min(A), 100),
(&maxA.-&minA.)/10,
roundz(max(B, C)+1, 1),
roundz(min(B, C), 1),
(&maxBC.-&minBC.)/10,
roundz(max(D), 1),
roundz(min(D), 1),
(&maxD.-&minD.+1)/3
into :maxA, :minA, :Ainc,
:maxBC, :minBC, :BCinc,
:maxD, :minD, :Dinc
from want;
run;
goptions reset=all ftext=SWISS htext=2.5 ;
axis1 order=(&minA to &maxA by &Ainc) minor=none label=(angle=90 'A label' ) offset=(1) ;
axis2 order=(&minBC to &maxBC by &BCinc) minor=(number=1) label=(angle=90 'BC Label') offset=(1);
axis3 order=(&minD to &maxD by &Dinc) minor=(number=2) label=('D') offset=(1) ;
symbol1 color=black i=join value=circle height=2 width=2 ;
symbol2 color=black i=join value=square height=2 width=2 ;
symbol3 color=black i=join value=triangle height=2 width=2 ;
legend1 label=none mode=reserve position=(top center outside) value=('Label here' ) shape=symbol(5,1) ;
legend2 label=none mode=reserve position=(top center outside) value=('label 1' 'label 2') shape=symbol(3,1) ;
proc gplot data=want;
plot A*D=1 /overlay legend=legend1 vaxis=axis1 haxis=axis3 ;
plot2 B*D=2 &var_C*D=3 /overlay legend=legend2 vaxis=axis2 ;
run ;任何帮助都将不胜感激。即使这意味着一种完全不同的方法(尽管我也想知道我在哪里出了问题)。
谢谢你,皮尔
发布于 2014-06-17 16:21:21
你所做的是--写一个宏而不写一个宏。编写宏,这就更容易了。另外,如果您要让in始终为1/10,将其放入let语句中(尽管它们的概念可能有所不同,那么将它们作为参数保留)。
%macro graph_me(minA=,maxA=, minBC=,maxBC=, minD=, maxD=);
%let incA = %sysevalf((&maxA.-&minA.)/10); *same for incD and incBC;
goptions reset=all ftext=SWISS htext=2.5 ;
axis1 order=(&minA to &maxA by &incA) minor=none label=(angle=90 'A label' ) offset=(1) ;
axis2 order=(&minBC to &maxBC by &incBC) minor=(number=1) label=(angle=90 'BC Label') offset=(1);
axis3 order=(&minD to &maxD by &incD) minor=(number=2) label=('D') offset=(1) ;
symbol1 color=black i=join value=circle height=2 width=2 ;
symbol2 color=black i=join value=square height=2 width=2 ;
symbol3 color=black i=join value=triangle height=2 width=2 ;
legend1 label=none mode=reserve position=(top center outside) value=('Label here' ) shape=symbol(5,1) ;
legend2 label=none mode=reserve position=(top center outside) value=('label 1' 'label 2') shape=symbol(3,1) ;
%mend graph_me;现在编写SQL调用以获取这些参数到宏调用本身。
proc sql NOPRINT;
select
cats('%graph_me(minA=',roundz(min(A), 100),
',maxA=', roundz((max(A)+100), 100),
... etc. ...
into :mcall
from want;
quit;这使您可以生成多个调用,例如,如果您希望按某个变量进行分组(每个变量值有一个图)。
发布于 2014-06-17 14:36:06
sql中的2件事:您不能使用正在创建的宏,您只需要一个值,在执行max(B,C)时,您创建的值与dataset中的obs一样多,您需要另一个max。我不能检查sas图部件,因为我没有它,但是
proc sql NOPRINT;
select roundz((max(A)+100), 100) as maxA,
roundz(min(A), 100) as minA,
((calculated maxA)-(calculated minA))/10,
roundz(max(max(B, C))+1, 1) as maxBC,
roundz(min(min(B, C)), 1) as minBC,
((calculated maxBC)-(calculated minBC))/10,
roundz(max(D), 1) as maxD,
roundz(min(D), 1) as minD,
((calculated maxD)-(calculated minD)+1)/3
into :maxA, :minA, :Ainc,
:maxBC, :minBC, :BCinc,
:maxD, :minD, :Dinc
from want;
quit;https://stackoverflow.com/questions/24265760
复制相似问题