2014-09-02 259 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