SAS GChart:在水平图表中控制组和子组的顺序

时间:2015-07-31 17:16:40

标签: graph sas

举个例子,我有两组,每组四只动物。该组是变量group,子组变量是animal,并且主题需要出现在图表中,因为它们出现在数据集中。但是,gchart继续按升序放置子组变量。有一种简单的方法可以控制它吗?

下面是模拟数据集和代码:

data test;
    input animal $ group ttd;
    datalines;
    A157    1   840
    A164    1   840
    A163    1   840
    A118    1   840
    A113    2   125
    A109    2   230
    A175    2   840
    A304    2   50
    ;
run;

axis1 label=(f=arial h=1.5 'Time to Death (Hours Post-Exposure)') value=(f=arial h=1) order=(0 to 840 by 120) minor=(n=5) offset=(1,1);
axis2 label=(f=arial h=1.2 j=r 'Group') value=(f=arial h=1);
axis3 label=(f=arial h=1.2 j=c 'Animal') value=(f=arial h=1);
PATTERN1 C=BLACK;

proc gchart data=test;
  hbar animal /group=group nozero nostats sumvar=ttd type=sum
              width=0.4 space=1 raxis=axis1 gaxis=axis2 maxis=axis3;
run; quit;

请注意,生成的图形按升序排列了子组animals,而不是数据集中的正确顺序:

Notice the resulting graphic has the animals in ascending order, rather than the correct order in the dataset

2 个答案:

答案 0 :(得分:1)

我明白了。我基本上创建了一个order变量,命名变量动物名称,然后使用该有序变量创建图表而不是动物本身。以下是快速流程:

创建订单变量

data test1; set test;
    temp=_n_;
    char_animal=put(temp,3.);
run;

将您的动物序列列入清单

proc sql;
    select distinct quote(animal)
    into: animallist separated by " "
    from test1 order by temp;
quit;

%put &animallist.;

axis3语句中,使用值语句中的宏列表来" name"订单变量动物名称

axis1 label=(f=arial h=1.5 'Time to Death (Hours Post-Exposure)') value=(f=arial h=1) order=(0 to 840 by 120) minor=(n=5) offset=(1,1);
axis2 label=(f=arial h=1.2 j=r 'Group') value=(f=arial h=1);
axis3 label=(f=arial h=1.2 j=c 'Animal') value=(f=arial h=1 &animallist.);
PATTERN1 C=BLACK;

proc gchart data=test1;
  hbar char_animal /group=group nozero nostats sumvar=ttd type=sum
              width=0.4 space=1 raxis=axis1 gaxis=axis2 maxis=axis3;
run; quit;

现在注意图中的正确顺序:

enter image description here

答案 1 :(得分:0)

我认为你无法按照数据集顺序获取它。 (从技术上讲,顺便说一句,这是动物价值的升序顺序 - 当它下降时,它仍然被认为是从过程的角度提升;见ASCENDING / DESCENDING选项如何命令。)

根据我的理解,HBAR的gplot允许(默认值=值的升序,ASCENDING =柱的升序,DESCENDING =柱的降序)。

您可以使用SGPLOT(具有grouporder=data选项,至少为9.4)。

proc sgplot data=test;
  hbar group/ response=ttd group=animal groupdisplay=cluster grouporder=reversedata;
run;

我使用reversedata,因为上升/下降的东西在hbars中翻转而不是看似合乎逻辑的东西,但如果您愿意,也可以翻转轴本身(或者如果您的版本中没有reverseata)