PROC GCHART中轴值标签和条形标签的不同数字格式

时间:2015-02-05 16:28:35

标签: sas

有没有办法直接为轴值和数据标签指定格式?据我所知,它使用了应用于因变量的任何格式。

示例:

data sample;
  input group $ number;
  format number dollar6.1;
  cards;
A 55.2
B 20.3
C 47.1
D 43.2
;
run;

axis1 minor=none order=0 to 60 by 10; 

proc gchart data=sample; 
  vbar group/ type=sum sumvar=number sum levels=all raxis=axis1; 
run; 

如果我将格式设置为dollar6.1,则轴标签具有不必要的小数(0.0,10.0,20.0等)

但是,如果我将格式设置为dollar6.0,那么每个条形图顶部的标签都会缺少我想要显示的小数。

是否可以单独为这两种格式指定格式?

3 个答案:

答案 0 :(得分:2)

我不相信你可以单独控制格式;你对时间轴,日志轴等的控制有限,但不能控制数字格式。

你可以做的是两件事之一。至少在SGPLOT中,您可以使用不同的格式创建辅助变量,并使用格式化您希望轴格式化的变量生成空图形(或条形图的相同副本但没有标签);然后使用第二个格式化的变量生成图表。

其次,您可以为轴指定显式值。您可以使用VALUE =覆盖刻度线上的标签,而不是使用数据产生的自动值。如果你有一个变化的轴(即你用不同的轴数或其他东西生产其中的20个),这不是最佳的,但如果它是一个固定的轴,那么你可能可以逃脱这个。请查看the AXIS statement in GChart以获取更多信息。

你如何做第一个选择:

data sample;
  input group $ number;
  format number dollar6.1;
  axis_number = number;
  format axis_number dollar6.0;
  cards;
A 55.2
B 20.3
C 47.1
D 43.2
;
run;


proc sgplot data=sample;
  vbar group /response=axis_number;
  vbar group /response=number datalabel;
  yaxis label='Number (sum)';
run;

创建条形图两次,一次使用axis_number然后定义轴,一次使用数字定义标签。

答案 1 :(得分:2)

您可以使用annotate dataset执行此类操作。如果我对它的工作方式有充分的了解,我会对此做出更好的解释,但我很少使用它,通常更多的是试错过程:

data sample;
  input group $ number;
  format number dollar6.0;
  cards;
A 55.2
B 20.3
C 47.1
D 43.2
;
run;

创建anno数据集。我从上面的链接中取出了这个并且摆脱了无关紧要的东西。设置[function]='label'[position] = '2'将标签放在条形图上方,xsys = 2'ysys = 2以使数据值的坐标为基础。 sizestyle控制字体。

midpoint=group将标签放在条形图上,y=number使标签的y坐标等于条形图的高度,text是指定条形图的值和格式的位置标签

SAS Annotate Dictionary

data anno;
   length function style $12;
   retain function 'label' size 1 position '2'          
          xsys '2' ysys '2' style 'Albany AMT';
   set sample;
   midpoint=group;
   y=number;
   text=put(number,dollar6.1);
run;

使用当前代码制作图表,但删除sum并插入annotate=anno

axis1 minor=none order=0 to 60 by 10; 

proc gchart data=sample; 
  vbar group/ type=sum sumvar=number annotate=anno levels=all raxis=axis1; 
run;

答案 2 :(得分:1)

如果您正在运行9.2或更高版本,并且很高兴使用Graphics Template Language (GTL),那么您可以这样做:

为您的数据添加一个新列,用于舍入值:

data sample;
  input group $ number;
  format number dollar6.1;
  axisval=round(number,1);
  cards;
A 55.2
B 20.3
C 47.1
D 43.2
;
run;

定义图表:

proc template;
  define statgraph mychart;
    begingraph;
      layout overlay;
        barchartparm  x=group y=axisval / datalabel=number;
      endlayout;
    endgraph;
  end;
run;

使用我们之前创建的数据渲染图表:

proc sgrender data=sample template=mychart;
run;

这里的技巧是使用datalabel=语句的barchartparm选项来指定哪个列包含标签的值。可能还有其他一些方法可以使用GTL并指定格式,但这对我来说似乎非常简单。

我认为GTL包含在Base SAS 9.2中。