【问题标题】:Change color of certain bars in proc sgplot vbar更改proc sgplot vbar中某些条的颜色
【发布时间】:2014-09-03 09:34:30
【问题描述】:

我使用的是 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;

【问题讨论】:

    标签: graph sas


    【解决方案1】:

    除非您希望所有 a 和所有 b 放在一起,否则分组变量在这里不起作用。你无法通过分组变量来解决这个问题。

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

    Attribute Maps 用于将变量值映射到属性(颜色、图案等)。您使用idvaluefillcolorlinecolor 或其他变量设置数据集,具体取决于您要更改的内容。

    • 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;
    

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

    例如,如果您不介意 hackiness,则此方法有效。它确实需要 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 获得图例吗?还有一点是我需要添加length fillcolor $ 8
    • @Pekka 修复了问题,并添加了关于如何处理图例的建议。
    • 嗨,谢谢,这几乎可以工作,但在最后一个代码中,我的 s5 条是蓝色的。我不明白这怎么可能。看起来 SAS 在这里窃听。顺便说一句,autoitemsize 选项会引发错误。那应该怎么做?
    • 我想通了。 Dattrmap 必须按 id 排序。我希望 SAS 对这种事情有一些简单的选择,但这正是我想要的。你还能修复那个autoitemsize 的东西吗? legendlabel 似乎也没有在那里做任何事情。
    • 实际上 SAS 似乎从第一个情节中汲取了传说。所以如果我先指定虚拟图,我似乎仍然可以使用自动图例。
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多