首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在proc sgplot vbar中更改某些条的颜色

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

Stack Overflow用户
提问于 2014-09-03 17:34:30
回答 1查看 9.5K关注 0票数 1

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

这是我想要的,但我希望s2和s5在绘图中有不同的颜色。最好也有图例:

代码语言:javascript
复制
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语句被忽略了:

代码语言:javascript
复制
proc sgplot data=gr;
    vbar x /response=y group=groupvar CATEGORYORDER=RESPDESC ;
run;

然后我也试过了,但是没有任何帮助。

代码语言:javascript
复制
proc sort data=gr;
    by groupvar;
run;

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

备注:我不确定group语句是否对我有帮助,因为它似乎是为所有组中实际上都存在所有x轴变量的情况而设计的。例如,像这样。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-03 20:12:42

分组变量在这里是行不通的,除非你想把所有的a和b放在一起。你不能通过对变量进行分组来解决这个问题。

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

Attribute Maps用于将变量值映射到属性(颜色、图案等)。您可以使用idvalue设置一个数据集,然后根据您要更改的内容设置fillcolorlinecolor或诸如此类的变量。

  • id是每个单独属性映射的唯一ID。一个数据集中可以存在多个属性映射,但每个id值都是一次使用的一组映射-例如,它应该基于一个变量。您将使用基于此值的属性映射(因此,此处为s1 s2等-我不认为您可以使用ab,因为您确实不想按它们进行分组)。相反,group by x.
  • Then fillcolor应该是redgreen或诸如此类的字符变量。

如下所示:

代码语言:javascript
复制
data dattrmap;
 set gr;
 value=x;
 length fillcolor $8;
 id='xcolor';
 if groupvar='a' then fillcolor='red';
 else fillcolor='green';
run;

然后在sgplot中使用它,类似于

代码语言:javascript
复制
proc sgplot data=gr dattrmap=dattrmap;
  vbar x/response=y group=x attrid=xcolor;
run;

根据关于这个传奇的评论,据我所知,你必须推出你自己的传奇,或者做一些有点老生常谈的事情来让它工作。您可以使用INSET (这是一个文本框),在其中更改文本的颜色(不完全确定这是否有效),或者您可以制作一个您不打算实际显示的虚拟图(即,您将覆盖它以使其不可见),但它提供了图例。GTL在这方面会做得更好(因为你可以在那里手工写出图例),但是属性映射会更混乱,所以我不知道哪个更好。

例如,如果你不介意hackiness的话,这是可行的。它确实需要VBARPARM而不是VBAR,VBAR适用于您所显示的数据。我们有第二组条形图,有意不显示,但生成图例。

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25640932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档