2014-09-02 260 views
0

我有一個我正在使用的數據集,與下面創建的數據集非常相似。我想在同一個圖上繪製每個州的分數趨勢圖。此外,我想遮蔽發生某些事情的一部分圖形(在這種情況下,分數下降)。比方說,我預計這次活動將在2011年至2013年之間進行。我想在這些年份爲這個淺灰色的矩形畫一個陰影。我認爲我的代碼很接近,但不能完全正確地使用語法。註釋語法PROC SGRENDER SAS

任何幫助完成此將不勝感激。此外,關於清理proc模板語句的任何建議(都需要?或者我可以合併爲一個?)。謝謝。

編輯:我認爲,主要問題是annorec數據步驟的語法。

data statescores; 
     input state $ year score; 
     cards; 
    NC 2010 75 
    NC 2011 77 
    NC 2012 72 
    NC 2013 85 
    NC 2014 87 
    SC 2010 72 
    SC 2011 73 
    SC 2012 60 
    SC 2013 79 
    SC 2014 76 
    VA 2010 80 
    VA 2011 80 
    VA 2012 79 
    VA 2013 81 
    VA 2014 83 
    ; 
    run; 

data drop;                               
    input startdate enddate;                        
    datalines;                               
2011 2013                               
; 

data annorec; 
/* length function style color $8;  */ 
    retain xsys '2' ysys '1' when 'b';                          
    set drop;                          
    function='rectangle'; 
    height=.4; 
    width=2; 
    x=startdate;                               
    y=60; 
    display="all"; 
    FILLCOLOR='LTGRAY'; 
    output;                           
/* function='bar';    */ 
/* x=enddate;     */ 
/* y=90;      */ 
/* color='ltgray';   */ 
/* style='solid';    */ 
/* output;      */ 
run;  

proc template; 
    define style styles.stocks; 
    parent=styles.listing; 
    style GraphData1 from GraphData1/
     ContrastColor=blue 
     Color=red 
     MarkerSymbol="CircleFilled" 
     Linestyle=1; 
    style GraphData2 from GraphData2/
     ContrastColor=brown 
     Color=blue 
     MarkerSymbol="none" 
     Linestyle=2; 
    style GraphData3 from GraphData3/
     ContrastColor=orange 
     Color=orange 
     MarkerSymbol="none" 
     Linestyle=2; 
end; 
run; 

proc template; 
    define statgraph trend; 
    begingraph; 
    entrytitle "Scores for NC, SC, and VA"; 
    discreteattrmap name="stockname"/ignorecase=true; 
    value 'NC'/
    markerattrs=GraphData1(color=red symbol=circlefilled) 
    lineattrs=GraphData1(color=red pattern=solid); 
    value 'SC'/
    markerattrs=GraphData2(color=orange) 
    lineattrs=GraphData2(color=green pattern=dot); 
    value 'VA'/
    markerattrs=GraphData3(color=blue) 
    lineattrs=GraphData3(color=blue pattern=dot); 
    enddiscreteattrmap; 
    discreteattrvar attrvar=stockmarkers var=stock 
    attrmap="stockname"; 
    layout overlay; 
    seriesplot x=year y=score/
    group=state 
    display=(markers) 
    name="scores"; 
    discretelegend "scores"/title="State Scores"; 
    endlayout; 
    endgraph; 
    end; 
run; 
/* Plot the score trends */ 
ods pdf file="/sasdata/username/testgraph.pdf"; 
ods pdf style=styles.stocks; 


proc sgrender data=statescores template=trend sganno=annorec; 
run; 
quit; 

ods pdf close; 
+0

您運行的是哪個SAS版本? – Joe 2014-09-02 14:27:05

+0

服務器上的SAS Enterprise Guide 6.1。 – pyll 2014-09-02 15:14:43

+0

這不是你的SAS版本;但它很可能是9.4,這聽起來是對的嗎? – Joe 2014-09-02 15:15:10

回答

1

我會盡量避免在GTL中使用離散屬性映射,如果可以避免的話。如果你只有幾個州,你真的不需要它;即使在上面的代碼中,它也沒有什麼比重寫在早期的模板步驟中設置的一些東西。屬性映射對於SGPLOT來說很不錯,但根據我的經驗,這對GTL來說很痛苦。

在這種情況下,您應該嘗試使用BAND圖來製作灰色帶。與它的一些打法,但是這應該基本上給你你想要的東西:

proc sgplot data=statescores; 
series x=year y=score/ group=state; 
band y=score upper=2013 lower=2011 /transparency=0.8 ; 
run; 

這使得與四行代碼一個非常好看的情節,再加上如果你想添加的顏色,你可以很容易(在屬性圖數據集或模板代碼)。一般來說,在SGPlot/GTL世界中,註釋數據集通常是不必要的,因爲您可以輕鬆地對圖進行層層疊加,並且可以通過分層圖進行很多註釋。

如果您想要更詳細的代碼審查,我建議發佈在communities.sas.com上,其中一些在SAS工作的圖形開發人員經常會提供有關代碼改進的建議。

+0

感謝您的幫助,喬。 – pyll 2014-09-02 16:57:49