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

Different number formats for axis value labels and bar labels in PROC GCHART

有什么方法可以直接指定轴值和数据标签的格式吗?据我所知,它使用应用于因变量的任何格式。

示例:

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,那么每个条形图顶部的标签都会缺少我想要显示的小数位。

有没有办法为其中任何一个独立指定格式?

我不相信你可以单独控制格式;就时间轴、对数轴等而言,您的控制种类有限,但无法控制数字格式。

您可以做的是两件事之一。至少在 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 定义轴,一次用数字定义标签。

您可以使用 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 数据集。我从上面的 link 中提取了这个并去掉了无关的东西。设置 [function]='label'[position] = '2' 将标签放置在条形上方,xsys = 2'ysys = 2 将坐标基于数据值。 sizestyle 控制字体。

midpoint=group 将标签放在条形上,y=number 使标签的 y 坐标等于条形的高度,text 是您指定值和格式的地方你的标签。

SAS Annotate Dictionary

data anno;
   length function style ;
   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;

如果您是 运行 9.2 或更高版本,并且乐于使用 那么您可以这样做:

向您的数据添加一个新列以对值进行舍入:

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;

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

我相信 GTL 包含在 Base SAS 9.2 之后。