Graph 在proc sgplot vbar中更改某些条的颜色
我正在使用SAS 9.3 如何在proc sgplot vbar中更改条形图的颜色 这是我想要的,但我希望s2和s5在绘图中有不同的颜色。最好还有图例: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
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。