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
将坐标基于数据值。 size
和 style
控制字体。
midpoint=group
将标签放在条形上,y=number
使标签的 y 坐标等于条形的高度,text
是您指定值和格式的地方你的标签。
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 之后。
有什么方法可以直接指定轴值和数据标签的格式吗?据我所知,它使用应用于因变量的任何格式。
示例:
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
将坐标基于数据值。 size
和 style
控制字体。
midpoint=group
将标签放在条形上,y=number
使标签的 y 坐标等于条形的高度,text
是您指定值和格式的地方你的标签。
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 之后。