2015-02-05 60 views
2

有没有什么方法可以直接指定轴值和数据标签的格式?据我所知,它使用任何适用于因变量的格式。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,那么每个栏顶部的标签都缺少我想要显示的小数。

任何方式来指定格式独立的任何一个?

回答

2

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

你可以做的是两件事之一。至少在SGPLOT中,您可以使用格式不同的格式创建一个具有不同格式的二级变量,并生成一个空图(或条形图的相同副本,但没有标签);然后用第二个其他格式化的变量生成图表。其次,您可以为该轴指定明确的值。您可以使用VALUE =覆盖放在刻度线上的标签,而不是使用数据中产生的自动值。如果你有一个变化的轴(也就是说,你可以用不同的轴数量或者其他数据生成其中的二十个),那么这不是最优的,但是如果它是一个固定的轴,那么你可能就会摆脱这种情况。查看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; 

与定义标签号创建条形图两次,一次是与轴编号,然后定义轴,并一次。

+1

谢谢,幸运的是我使用同一个轴制作多个图表,因此我可以执行'value =('$ 0''$ 10'...'$ 60')'并且它可以工作。如果我需要不同的轴测量,我怀疑我可以编写一个宏来自动完成它。 如果有人对GCHART有替代解决方案,我会留下这个问题,否则这对我很有用。 – orh 2015-02-05 17:09:38

+0

我添加了一个如何在SGPLOT中执行双重覆盖图的例子。这是[Graphically Speaking](图形演讲)(http://blogs.sas.com/content/graphicallyspeaking/)上会看到的很多内容。它看起来在GCHART中使用GREPLAY在理论上是可能的,但似乎比使用上述任何一种解决方案更有用。 – Joe 2015-02-05 22:17:01

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

诀窍这里使用barchartparm语句的datalabel=选项来指定哪些列包含标签值。可能还有其他一些方法可以使用GTL和指定格式来完成此操作,但这对我来说看起来很简单。我相信GTL包含在Base SAS 9.2以后的版本中。

+0

这是另一个不错的选择。不幸的是,SGPLOT不允许您在plot语句中指定datalabel源,因为它可能在GTL中。我猜这是因为双重覆盖的图很容易做到 - Sanjay Matange(ODS Graphics/GTL产品的首席开发人员)始终都在使用它 - 他们没有认为它是需要的,但仍然很奇怪这是不可能的。 – Joe 2015-02-05 22:05:35

+0

我必须了解更多关于GTL的知识。似乎有很多地方是有用的。 – orh 2015-02-06 16:31:39

+0

@otto想要感受它的一种快捷方式是在SAS会话中提交代码'%sgdesign;'。它将启动一个GUI界面,您可以点击并点击以使用它提供的大部分功能。 – 2015-02-06 23:22:20