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

Graph 在proc sgplot vbar中更改某些条的颜色,graph,sas,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 CATE

我正在使用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;
评论: 我不确定group语句是否能在这里帮助我,因为它似乎是为所有组中都存在所有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;

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

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

用于将变量值映射到属性(颜色、图案等)。您使用
id
,然后根据您试图更改的内容设置
fillcolor
linecolor
或其他变量来设置数据集

  • id
    是每个单独属性映射的唯一id。多属性映射可以存在于一个数据集中,但每个
    id
    值都是一组映射,可以同时使用-例如,它应该基于一个变量。您将使用基于此值的属性映射
  • value
    是变量值(因此这里,
    s1
    s2
    等等-我认为你不能使用
    a
    b
    ,因为你真的不想按它们分组)。您将改为按
    x
    分组
  • 然后
    fillcolor
    应该是
    red
    green
    或诸如此类的字符变量
大概是这样的:

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;
根据对传奇的评论,据我所知,你必须滚动你自己的传奇或者做一些有点黑客的事情才能让它工作。您可以使用
插入图
(这是一个文本框),在其中更改文本的颜色(不完全确定这是否可行),或者您可以制作一个不打算实际显示的虚拟绘图(即,您将覆盖它使其不可见),但它会生成图例。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;

你好您的答案需要一些修复:随处切换dattrmap attrmap。那么需要一个“是”组。但是指定组不允许
CATEGORYORDER=RESPDESC
,因此我必须按y排序并指定
grouporder=data
。此外,包括团体声明也会弄乱我的传奇。你知道我怎么还能得到groupvar的legend吗?还有一个小问题是,我需要添加
length fillcolor$8
@Pekka修复了问题,并添加了一个关于如何处理图例的建议。您好,谢谢,这几乎可以正常工作,但在上一个代码中,我的s5条是蓝色的。我不明白这怎么可能。看起来SAS在这里窃听。顺便说一句,autoitemsize选项会抛出一个错误。那该怎么办?我知道了。Dattrmap必须按id排序。我希望SAS对这类事情有一些简单的选择,但这正是我想要的。你还可以修复这个
autoitemsize
问题吗。另外,legendlabel
似乎在那里没有任何作用。实际上,SAS似乎从第一个情节中提取了图例。因此,如果我首先指定虚拟绘图,我似乎仍然可以使用autolegend。