在SAS SGPLOT中设置不同组的样式

时间:2019-01-22 14:00:52

标签: sas

我正在尝试生成具有多个分组的图。示例数据代码为:

proc sort data=sashelp.cars out=cars;
  by DriveTrain;
  where n(Cylinders);
run;

我使用dattrmap向不同的组添加了不同的颜色,如下所示:

  data MyAttrMap;
   length MARKERCOLOR CONTRASTCOLOR color $25;
   ID='myreg'; value='All' ; MARKERCOLOR='red'; color='red'; MARKERSYMBOL = 'circle'; output;
   ID='myreg'; value='Front'; MARKERCOLOR='blue'; color='blue'; MARKERSYMBOL = 'circle'; output;
   ID='myreg1'; value='USA'; CONTRASTCOLOR='yellow'; color='yellow'; output;
   ID='myreg1'; value='Europe'; CONTRASTCOLOR='black'; color='black'; output;
   ID='myreg1'; value='Asia'; CONTRASTCOLOR='green'; color='green'; >       >       output;
  run;

  proc sgplot data=work.cars
   dattrmap=MyAttrMap;
   hbarparm category=enginesize response=horsepower/group=DriveTrain barwidth=.5 attrid=myreg name='dt';
  scatter X=MPG_City Y=enginesize /group=origin name='origin' attrid=myreg1;
   keylegend 'dt' / title='Drive Train' location=outside position=bottom;
  keylegend 'origin' / title='Origin' location=outside position=bottom;
  where DriveTrain in ('All' 'Front');
  run; 

创建Attrmap的目的是为OriginDriveTrain使用不同的颜色,但是,当创建输出时,将应用于Origin的相同颜色应用于DriveTrain。

我还尝试使用Proc模板来更改样式,如下所示:

  /*Different colors from the ones used above*/
  proc template;
   define style MyStyle;
  parent = Styles.Listing;
   STYLE graphdata1 /
                MARKERSYMBOL = 'circle'
                 LINESTYLE = 1
                 CONTRASTCOLOR = liypk
                 COLOR = red
          ;
          STYLE graphdata2 /
                MARKERSYMBOL = 'circle'
                 LINESTYLE = 1
                 CONTRASTCOLOR = stybr
                 COLOR = yellow
          ;
          STYLE graphdata3 /
                MARKERSYMBOL = 'circle'
                 LINESTYLE = 1
               CONTRASTCOLOR = mog
                COLOR = green
         ;
          STYLE graphdata4 /
                MARKERSYMBOL = 'circle'
                LINESTYLE = 1
                CONTRASTCOLOR = brown
                COLOR = pink
         ;
          STYLE graphdata5 /
                MARKERSYMBOL = 'circle'
                LINESTYLE = 1
                CONTRASTCOLOR = black
                 COLOR = grey
          ;
   end;
  run;

但是仍然获得了相同的结果。谁能告诉我我在做什么错或如何使它正常工作?我正在使用SAS 9.3。

我遇到的另一个问题是排序。我想对这些条进行排序,以使相同的原点一起出现并以马力显示。我按照SAS的建议使用sortkey=national进行了排序,并使用了grouporder=data,但这并没有改变输出的顺序。任何帮助表示赞赏。

boolean indexing

谢谢。

2 个答案:

答案 0 :(得分:2)

您可能会发现SGPANEL是一个更好的选项,可以直观地呈现不同组的分布。

ods html style=normal;
ods graphics / height=900px;

proc sgpanel data=sashelp.cars;
  panelby origin 
  / columns=3
  ;

  hbar enginesize 
  / group=drivetrain
    groupdisplay=cluster
  ;

  where 
    DriveTrain in ('Front', 'All')
    and not missing(cylinders)
  ;
run;

enter image description here

答案 1 :(得分:0)

检查属性映射数据集。由于您尚未为 Value ID 列指定长度,因此它们被截断并且与您的数据不匹配,因此无法正确分配它们。

为简化您的问题,我分配了所有要测试的元素:

我还认为这是由于日志中的错误而造成的。

proc sort data=sashelp.cars out=cars;
    by DriveTrain;
    where n(Cylinders);
run;

data MyAttrMap;
    length ID $10. linecolor MARKERCOLOR CONTRASTCOLOR fillcolor color value $25;
    ID='myreg1';
    value='USA';
    contrastcolor='cxaf8dc3';
    LINECOLOR='cxaf8dc3';
    MARKERCOLOR='cxaf8dc3';
    fillcolor='cxaf8dc3';
    output;
    ID='myreg1';
    value='Europe';
    contrastcolor='cx7fbf7b';
    LINECOLOR='cx7fbf7b';
    MARKERCOLOR='cx7fbf7b';
    fillcolor='cx7fbf7b';
    output;
    ID='myreg1';
    value='Asia';
    contrastcolor='cx91bfdb';
    LINECOLOR='cxfc8d59';
    MARKERCOLOR='cxfc8d59';
    fillcolor='cxfc8d59';
    output;
run;

ods graphics / attrpriority=none;

proc sgplot data=work.cars dattrmap=MyAttrMap;
    scatter X=MPG_City Y=enginesize /group=origin name='origin' attrid=myreg1;
    where DriveTrain in ('All' 'Front');
run;