更改proc sgplot vbar中某些条形的颜色

时间:2014-09-03 09:34:30

标签: graph sas

我正在使用SAS 9.3 如何更改proc sgplot vbar中的条形颜色。

这就是我想要的但我希望s2和s5在情节中有不同的颜色。最好也应该有传说。:

data gr;
    input x $ y  groupvar $;
    datalines;
    s1 20 a
    s2 20 b
    s3 30 a
    s4 25 a
    s5 45 b
    ;
run;

proc sgplot data=gr;
    vbar x /response=y CATEGORYORDER=RESPDESC ;
run;

这会产生我想要的东西,除非现在我的CATEGORYORDER语句被忽略了:

proc sgplot data=gr;
    vbar x /response=y group=groupvar CATEGORYORDER=RESPDESC ;
run;

然后我也尝试了这个,但它没有任何帮助。

proc sort data=gr;
    by groupvar;
run;

proc sgplot data=gr;
    vbar x /response=y group=groupvar GROUPORDER = DATA;
run;

注释: 我不确定组声明是否可以帮助我,因为它似乎是针对所有组中实际存在所有x轴变量的情况而设计的。例如像这样。

data gr;
    input x $ y  groupvar $;
    datalines;
    s1 20 a
    s1 20 b
    s2 30 a
    s2 25 b
    s3 10 a
    s3 12 b
    ;
run;

proc sgplot data=gr;
    vbar x /response=y group=groupvar GROUPDISPLAY=CLUSTER GROUPORDER = DATA;
run;

1 个答案:

答案 0 :(得分:2)

分组变量在这里不起作用,除非你想要所有的a和所有的b在一起。你不能用分组变量解决这个问题。

你有两个大图片选择。一种是使用属性贴图,一种是使用多个高低图来模拟条形图颜色。我认为前者更容易,所以我不会进入后者 - 只要记住其他可能的问题;高低图表在很多方面都是条形图的更灵活版本。

Attribute Maps用于将变量值映射到属性(颜色,模式等)。您设置的数据集包含idvalue,然后是fillcolorlinecolor或其他变量,具体取决于您要更改的内容。

  • id是每个单独的属性映射的唯一ID。多个属性映射可以存在于一个数据集中,但每个id值是一组将立即使用的映射 - 例如,它应基于一个变量。您将根据此值使用属性映射。
  • value是变量值(因此,s1 s2等等 - 我认为您不能使用ab真的不想被他们分组)。您将改为按x分组。
  • 然后fillcolor应为redgreen或其他,作为字符变量。

这样的事情:

data dattrmap;
 set gr;
 value=x;
 length fillcolor $8;
 id='xcolor';
 if groupvar='a' then fillcolor='red';
 else fillcolor='green';
run;

然后在sgplot中使用它,比如

proc sgplot data=gr dattrmap=dattrmap;
  vbar x/response=y group=x attrid=xcolor;
run;

根据有关传说的评论,你必须推出自己的传奇,或者做一些有点hacky的事情,据我所知,让它发挥作用。您可以使用INSET(这是一个文本框)来改变文本的颜色(不完全确定这是否可行)或者您可以创建一个您不打算实际显示的虚拟图表(也就是说,你将它覆盖为不可见),但它有助于传说。 GTL会做得更好(因为你可以在那里手工编写传说)然后属性图会更乱,所以我不知道哪个更好。

例如,如果你不介意黑客,那就有用。它确实需要VBARPARM而不是VBAR,这对于您呈现的数据来说很好。我们有第二组条形图,故意不显示但会生成图例。

data dattrmap;
 set gr;
 id='xcolor';
 value=x;
 length fillcolor $8;
 if groupvar='a' then fillcolor='red';
 else fillcolor='green';
 output;
 if _n_=1 then do;
   id='acolor';
   value='a';
   fillcolor='red';
   output;
   value='b';
   fillcolor='green';
   output;
 end;
run;

proc sgplot data=gr dattrmap=dattrmap noautolegend;
  vbarparm category=x response=y/ group=x attrid=xcolor;
  vbarparm category=x response=y/ group=groupvar barwidth=0 nooutline attrid=acolor name="forlegend" legendlabel="Groupings";
  keylegend "forlegend"/ autoitemsize;
run;