2014-06-17 60 views
1

我正在嘗試使用SAS宏自動化圖形過程。由於這將用於多個不同的子集,因此必須相應地調整圖的軸。我嘗試了幾種不同的方法,並覺得我會沿着兔子洞走錯路。使用宏來生成圖形參數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軸從分(d)到最大(d)通過一些合理的增量 左軸從分(A)到最大值( A) 從分(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 ; 

任何幫助將不勝感激。即使這意味着一種完全不同的方式(儘管我也有興趣知道我在哪裏出錯了)。

感謝,減壽

在SQL

回答

1

你在做什麼是寫一個宏,而無需編寫宏排序的。編寫宏,這很容易。另外,如果你打算讓INCs總是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; 

這給你的優點是你可以生成多個通話如果,例如,要做到這一點通過一些變量(有每個變量值的一個圖)分組。

1

兩件事: 你不能使用你所創建的宏,你只需要一個值,做max(B,C)時,因爲有數據集中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; 
+0

謝謝。這工作。 – pyll