SAS报表颜色设置与样式调整全解析
1. 基于其他报表项设置颜色
在报表制作中,有时需要根据某个变量的值为特定列设置背景颜色。例如,根据
CUSTOMER_COUNTRY
变量的值为
TOTAL_RETAIL_PRICE
列设置背景颜色。
1.1 示例6.15:根据国家值更改总零售价格背景
options missing=”;
proc report data=orders;
column customer_country customer_age_group,
(quantity costprice_per_unit total_retail_price);
define customer_country / group format=$cntry.;
define customer_age_group /across;
define total_retail_price / ‘Retail Price’;
compute total_retail_price;
if customer_country in (‘US’ ‘DE’ ‘CA’) then do;
call define(‘_c4_’,‘style’,‘style=[background=cxfe9929]’);
call define(‘_c7_’,‘style’,‘style=[background=cxfe9929]’);
call define(‘_c10_’,‘style’,‘style=[background=cxfe9929]’);
call define(‘_c13_’,‘style’,‘style=[background=cxfe9929]’);
end;
else if customer_country = ‘AU’ then do;
call define(‘_c4_’,‘style’,‘style=[background=cxe0ecf4]’);
call define(‘_c7_’,‘style’,‘style=[background=cxe0ecf4]’);
call define(‘_c10_’,‘style’,‘style=[background=cxe0ecf4]’);
call define(‘_c13_’,‘style’,‘style=[background=cxe0ecf4]’);
end;
else do;
call define(‘_c4_’,‘style’,‘style=[background=yellow]’);
call define(‘_c7_’,‘style’,‘style=[background=yellow]’);
call define(‘_c10_’,‘style’,‘style=[background=yellow]’);
call define(‘_c13_’,‘style’,‘style=[background=yellow]’);
end;
endcomp;
run;
此示例中,
CUSTOMER_AGE_GROUP
被定义为
ACROSS
变量,其值成为标题,每个值下有
QUANTITY
、
COSTPRICE_PER_UNIT
和
TOTAL_RETAIL_PRICE
列。根据
CUSTOMER_COUNTRY
的值,为
TOTAL_RETAIL_PRICE
列设置不同的背景颜色。
1.2 示例6.16:使用宏程序应用属性更改
当
ACROSS
变量的值较多或
ACROSS
下的报表项较多时,示例6.15的代码会变得繁琐。可以使用宏程序来简化代码。
proc sql noprint;
select count(distinct customer_age_group) into: cntageg
from book.orders;
quit;
%macro rep;
%local varsleft varsunder i;
%let varsleft=1;
%let varsunder=3;
proc report data=orders;
column customer_country customer_age_group,
(quantity costprice_per_unit total_retail_price);
define customer_country / group format=$cntry.;
define customer_age_group /across;
define total_retail_price / ‘Retail Price’;
compute total_retail_price;
if customer_country in (‘US’ ‘DE’ ‘CA’) then do;
%do i=%eval(&varsleft+&varsunder) %to
%eval(&cntageg*&varsunder+&varsleft) %by &varsunder;
call define(
“_c&i._”,‘style’,‘style=[background=cxfe9929]’);
%end;
end;
else if customer_country = ‘AU’ then do;
%do i=%eval(&varsleft+&varsunder) %to
%eval(&cntageg*&varsunder+&varsleft) %by &varsunder;
call define(
“_c&i._”,‘style’,‘style=[background=cxe0ecf4]’);
%end;
end;
else do;
call define(
“_c&i._”,‘style’,‘style=[background=yellow]’);
end;
endcomp;
run;
%mend rep;
%rep
此宏程序通过计算
ACROSS
变量的类别数、
ACROSS
前的报表项数和
ACROSS
下的报表项数,自动生成
CALL DEFINE
语句所需的列引用。
1.3 示例6.17:根据
ACROSS
下的另一个变量更改属性
options missing=”;
proc report data=orders;
column customer_country customer_age_group,
(quantity costprice_per_unit total_retail_price);
define customer_country / group format=$cntry.;
define customer_age_group /across;
define total_retail_price / ‘Retail Price’;
compute total_retail_price;
if _c2_ < 10 then call define(‘_c4_’,‘style’,
‘style=[foreground=red font_weight=bold font_style=italic]’);
if _c5_ < 10 then call define(‘_c7_’,‘style’,
‘style=[foreground=red font_weight=bold font_style=italic]’);
if _c8_ < 10 then call define(‘_c10_’,‘style’,
‘style=[foreground=red font_weight=bold font_style=italic]’);
if _c11_ < 10 then call define(‘_c13_’,‘style’,
‘style=[foreground=red font_weight=bold font_style=italic]’);
endcomp;
run;
此示例根据
QUANTITY
列的值,为未达到销售目标(10单位)的
TOTAL_RETAIL_PRICE
列设置前景色为红色、字体加粗和倾斜。代码可以使用
ARRAY
语句和
DO
循环简化:
compute total_retail_price;
array cn{4} _c2_ _c5_ _c8_ _c11_;
do i=1 to 4;
if cn{i} < 10 then call define(
i*3+1,‘style’,‘style=[foreground=red font_weight=bold]’);
end;
endcomp;
2. 对角线上的颜色设置
对于某些报表,对角线上的值可能是最重要的,需要突出显示以吸引读者的注意力。当
GROUP
变量和
ACROSS
变量有递增的有序值时,突出显示对角线单元格很简单,因为可以将列号与行号进行比较。
2.1 示例6.18:在
ACROSS
下以对角模式应用颜色
proc sql noprint;
select count(distinct customer_age_group) into: cntageg
from orders;
quit;
options missing=”;
proc report data=orders;
column product_line customer_age_group;
define product_line /group;
define customer_age_group /across;
compute before product_line;
row_num+1;
endcomp;
compute customer_age_group;
do i=1 to &cntageg;
if row_num=i then call define(i+1,‘style’,
‘style=[background=cxfe9929]’);
end;
endcomp;
run;
此示例中,
PRODUCT_LINE
为
GROUP
变量,
CUSTOMER_AGE_GROUP
为
ACROSS
变量。在每个
PRODUCT_LINE
值之前,行号递增。通过比较行号和列号,为对角线上的单元格设置背景颜色。
3. 表头颜色设置
表头单元格的属性只能在
PROC TEMPLATE
的样式元素中更改,或者使用
PROC REPORT
或
DEFINE
语句中的
STYLE(HEADER)=
选项更改。
3.1
STYLE(HEADER)=
在
PROC REPORT
语句中
proc report data=orders
style(header)=[background=green foreground=white];
column product_category customer_gender quantity
total_retail_price;
define product_category / group;
define customer_gender / group;
define total_retail_price / ‘Retail Price’;
run;
此示例将所有表头单元格的背景颜色设置为绿色,前景颜色设置为白色。
3.2
STYLE(HEADER)=
在
DEFINE
语句中
proc report data=orders
style(header)=[background=green foreground=white];
column product_category customer_gender quantity
total_retail_price;
define product_category / group;
define customer_gender / group style(header)=[
background= cxfe9929];
define total_retail_price / ‘Retail Price’;
run;
此示例将
CUSTOMER_GENDER
列的表头背景颜色更改为橙色,前景颜色继承自
PROC REPORT
语句中的
STYLE(HEADER)=
选项。
3.3 跨列标题
ods escapechar=”^”;
proc report data=orders;
column product_category customer_gender
(‘^{style [background=green foreground=white]
Sales Information}’
quantity total_retail_price);
define product_category / group;
define customer_gender / group;
define total_retail_price / ‘Retail Price’;
run;
此示例使用内联格式将跨列标题的背景颜色设置为绿色,前景颜色设置为白色。在HTML输出中,背景颜色仅应用于文字后面;在ODS Excel和ODS Tagsets.ExcelXP目的地中,内联格式会被忽略。可以通过创建新变量并将其定义为
ACROSS
变量来解决。
3.4
ACROSS
变量标签和值标题
proc report data=orders;
column product_category customer_gender,
(quantity total_retail_price);
define product_category / group;
define customer_gender / across style(header)=[background=yellow];
define total_retail_price / ‘Retail Price’;
run;
此示例将
CUSTOMER_GENDER
变量的标签和值单元格的背景颜色设置为黄色。
3.5
ACROSS
值标题
proc format;
value $gen
“M” = “cxe0ecf4”
“F” = “cxc51b8a”
;
run;
proc report data=orders;
column product_category customer_gender,
(quantity total_retail_price);
define product_category / group;
define customer_gender / across style(header)=[background=$gen.];
define total_retail_price / ‘Retail Price’;
run;
此示例使用格式为
CUSTOMER_GENDER
变量的每个值设置不同的背景颜色。
3.6
ACROSS
标签与
ACROSS
值
proc format;
value $gen
“M” = “cxe0ecf4”
“F” = “cxc51b8a”
;
run;
ods escapechar=”^”;
proc report data=orders;
column product_category (‘^{style [background=yellow]Customer
Gender}’ customer_gender, (quantity total_retail_price));
define product_category / group;
define customer_gender / across
style(header)=[background=$gen.];
define total_retail_price / ‘Retail Price’;
run;
此示例使用跨列标题为
CUSTOMER_GENDER
变量设置标签和背景颜色。
4. LINE语句样式设置
默认情况下,
LINE
语句创建的文本居中显示。可以使用
PROC REPORT
语句中的
STYLE(LINES)=
选项或
COMPUTE
语句中的
STYLE=
选项更改对齐方式和其他样式属性。
4.1 示例6.26:应用属性到
LINE
语句
proc report data=orders;
column customer_country customer_group quantity total_retail_price;
define customer_country / group noprint;
define customer_group / group;
define total_retail_price / ‘Retail Price’;
compute before customer_country / style={just=l
background=lightblue};
line customer_country $cntry.;
endcomp;
run;
此示例将
LINE
语句输出的
CUSTOMER_COUNTRY
值左对齐,并将背景颜色设置为浅蓝色。
4.2 示例6.27a和6.27b:在同一位置放置两个具有不同属性的
LINE
语句
data orders2;
set orders;
c_country = customer_country;
run;
proc report data=orders2;
column customer_country c_country customer_group quantity
total_retail_price;
define customer_country / group noprint;
define c_country / group noprint;
define customer_group / group;
define total_retail_price / ‘Retail Price’;
compute before c_country /style={just=l background=lightblue};
line customer_country $cntry.;
endcomp;
compute before customer_country /style={background=cxfe9929};
line ‘ ‘;
endcomp;
此示例通过创建
CUSTOMER_COUNTRY
的副本
C_COUNTRY
,在同一位置放置两个具有不同属性的
LINE
语句。
总结
通过以上示例,我们学习了如何根据其他报表项、对角线位置、表头和
LINE
语句设置颜色和样式。在实际应用中,可以根据具体需求选择合适的方法,并根据数据的特点和报表的要求进行调整。同时,要注意不同输出目的地(如HTML、Excel)对样式设置的支持情况,以确保报表的显示效果符合预期。
流程图示例
graph TD;
A[开始] --> B[确定报表需求];
B --> C{是否需要根据其他报表项设置颜色};
C -- 是 --> D[选择合适的示例代码(如示例6.15、6.16、6.17)];
C -- 否 --> E{是否需要突出显示对角线};
E -- 是 --> F[使用示例6.18的代码];
E -- 否 --> G{是否需要设置表头颜色};
G -- 是 --> H[根据表头设置需求选择示例(如示例6.19 - 6.25)];
G -- 否 --> I{是否需要设置LINE语句样式};
I -- 是 --> J[使用示例6.26 - 6.27的代码];
I -- 否 --> K[结束];
D --> K;
F --> K;
H --> K;
J --> K;
表格示例
| 示例编号 | 功能描述 | 适用场景 |
|---|---|---|
| 示例6.15 | 根据国家值更改总零售价格背景 |
ACROSS
变量值较少,报表项较少
|
| 示例6.16 | 使用宏程序应用属性更改 |
ACROSS
变量值较多,报表项较多
|
| 示例6.17 |
根据
ACROSS
下的另一个变量更改属性
| 需要根据其他变量的值更改属性 |
| 示例6.18 |
在
ACROSS
下以对角模式应用颜色
| 需要突出显示对角线上的值 |
| 示例6.19 - 6.25 | 表头颜色设置 | 需要设置表头单元格的属性 |
| 示例6.26 - 6.27 |
LINE
语句样式设置
|
需要更改
LINE
语句输出的样式
|
SAS报表颜色设置与样式调整全解析(下半部分)
5. 不同设置方法的对比与选择
为了更清晰地了解各种颜色和样式设置方法的特点,我们可以通过以下表格进行对比:
| 设置方法 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 直接使用CALL DEFINE语句(示例6.15) | 代码逻辑简单,直观易懂 | 当
ACROSS
变量值多或报表项多时,代码繁琐 |
ACROSS
变量值少且报表项少的情况 |
| 使用宏程序(示例6.16) | 可自动生成列引用,简化代码 | 需要一定的宏编程知识 |
ACROSS
变量值多或报表项多的情况 |
| 根据其他变量更改属性(示例6.17) | 能根据特定条件灵活设置样式 | 代码可能较复杂,需处理多个条件判断 | 需要根据其他变量值更改属性的场景 |
| 对角线上颜色设置(示例6.18) | 突出显示重要数据,吸引读者注意力 | 要求
GROUP
和
ACROSS
变量有递增有序值 | 需要突出对角线数据的报表 |
| 表头颜色设置(示例6.19 - 6.25) | 可灵活设置表头样式,包括跨列标题等 | 不同ODS目的地表现可能不同,需额外处理 | 需要设置表头样式的报表 |
|
LINE
语句样式设置(示例6.26 - 6.27) | 可更改文本对齐和样式属性 | 同一计算块内多个
LINE
语句属性控制较难 | 需要调整
LINE
语句输出样式的报表 |
在实际应用中,我们可以根据具体的报表需求和数据特点,参考上述表格选择合适的设置方法。例如,如果报表中
ACROSS
变量值较少,且报表项也不多,那么直接使用
CALL DEFINE
语句可能是一个不错的选择;如果
ACROSS
变量值较多,为了避免代码过于繁琐,使用宏程序会更合适。
6. 常见问题及解决方法
在进行报表颜色和样式设置时,可能会遇到一些常见问题,以下是一些问题及对应的解决方法:
-
问题1:内联格式在某些ODS目的地不生效
-
描述
:在使用内联格式设置跨列标题背景颜色时,在ODS Excel和ODS Tagsets.ExcelXP目的地中,背景颜色可能无法正确显示。
-
解决方法
:可以创建一个新变量,将其定义为
ACROSS
变量,并使用
STYLE(HEADER)=
选项设置背景颜色,如示例6.22所示。
-
问题2:同一计算块内多个
LINE
语句无法分别控制样式
-
描述
:默认情况下,无法分别控制同一计算块内多个
LINE
语句的样式属性。
-
解决方法
:可以创建一个新的分组变量,如示例6.27a和6.27b所示,通过复制原变量,在不同的计算块中设置不同的样式。
-
问题3:代码中列引用计算错误
-
描述
:在使用宏程序或根据列号进行样式设置时,可能会出现列引用计算错误的情况。
-
解决方法
:仔细计算
ACROSS
变量的类别数、
ACROSS
前的报表项数和
ACROSS
下的报表项数,确保列引用的计算正确。可以使用
SHOWALL
选项显示所有列,准确获取列号。
7. 实际应用案例分析
假设我们要制作一个销售报表,展示不同产品类别、客户性别下的销售数量和总零售价格。同时,我们希望根据客户所在国家为总零售价格列设置背景颜色,突出显示对角线上的数据,并设置表头和
LINE
语句的样式。以下是实现该报表的详细步骤:
1.
数据准备
:假设我们有一个名为
orders
的数据集,包含
product_category
、
customer_gender
、
customer_country
、
quantity
和
total_retail_price
等变量。
2.
根据国家值设置总零售价格背景颜色
:使用示例6.16的宏程序方法,避免代码过于繁琐。
proc sql noprint;
select count(distinct customer_gender) into: cntgender
from orders;
quit;
%macro rep;
%local varsleft varsunder i;
%let varsleft=2;
%let varsunder=2;
proc report data=orders;
column product_category customer_gender,
(quantity total_retail_price);
define product_category / group;
define customer_gender / across;
define total_retail_price / ‘Retail Price’;
compute total_retail_price;
if customer_country in (‘US’ ‘DE’ ‘CA’) then do;
%do i=%eval(&varsleft+&varsunder) %to
%eval(&cntgender*&varsunder+&varsleft) %by &varsunder;
call define(
“_c&i._”,‘style’,‘style=[background=cxfe9929]’);
%end;
end;
else if customer_country = ‘AU’ then do;
%do i=%eval(&varsleft+&varsunder) %to
%eval(&cntgender*&varsunder+&varsleft) %by &varsunder;
call define(
“_c&i._”,‘style’,‘style=[background=cxe0ecf4]’);
%end;
end;
else do;
call define(
“_c&i._”,‘style’,‘style=[background=yellow]’);
end;
endcomp;
run;
%mend rep;
%rep
-
突出显示对角线上的数据
:使用示例6.18的方法,假设
product_category为GROUP变量,customer_gender为ACROSS变量。
proc sql noprint;
select count(distinct customer_gender) into: cntgender
from orders;
quit;
options missing=”;
proc report data=orders;
column product_category customer_gender;
define product_category / group;
define customer_gender / across;
compute before product_category;
row_num+1;
endcomp;
compute customer_gender;
do i=1 to &cntgender;
if row_num=i then call define(i+1,‘style’,
‘style=[background=cxfe9929]’);
end;
endcomp;
run;
-
设置表头颜色
:使用
STYLE(HEADER)=选项设置表头背景和前景颜色。
proc report data=orders
style(header)=[background=green foreground=white];
column product_category customer_gender quantity
total_retail_price;
define product_category / group;
define customer_gender / group;
define total_retail_price / ‘Retail Price’;
run;
-
设置
LINE语句样式 :假设我们要在每个产品类别前显示该类别的名称,左对齐并设置背景颜色为浅蓝色。
proc report data=orders;
column product_category customer_gender quantity total_retail_price;
define product_category / group noprint;
define customer_gender / group;
define total_retail_price / ‘Retail Price’;
compute before product_category / style={just=l
background=lightblue};
line product_category $cntry.;
endcomp;
run;
通过以上步骤,我们可以制作出一个满足需求的销售报表,展示不同产品类别、客户性别下的销售情况,同时突出显示重要数据,设置表头和
LINE
语句的样式。
总结与展望
通过本文的介绍,我们详细学习了SAS报表中颜色和样式设置的多种方法,包括基于其他报表项设置颜色、对角线上颜色设置、表头颜色设置和
LINE
语句样式设置等。同时,我们还了解了不同设置方法的优缺点、常见问题及解决方法,并通过实际应用案例进行了分析。
在未来的报表制作中,我们可以根据具体需求灵活运用这些方法,不断优化报表的视觉效果,提高报表的可读性和专业性。随着数据量的不断增加和报表需求的日益复杂,我们还可以进一步探索更高效、更灵活的设置方法,以满足不同场景下的报表制作需求。
流程图示例
graph TD;
A[开始制作报表] --> B[数据准备];
B --> C{是否需要根据国家设置颜色};
C -- 是 --> D[使用宏程序设置颜色(示例6.16)];
C -- 否 --> E{是否需要突出对角线数据};
E -- 是 --> F[设置对角线颜色(示例6.18)];
E -- 否 --> G{是否需要设置表头颜色};
G -- 是 --> H[设置表头颜色(示例6.19 - 6.25)];
G -- 否 --> I{是否需要设置LINE语句样式};
I -- 是 --> J[设置LINE语句样式(示例6.26 - 6.27)];
I -- 否 --> K[完成报表制作];
D --> E;
F --> G;
H --> I;
J --> K;
表格示例
| 需求 | 对应示例 | 代码片段 |
|---|---|---|
| 根据国家设置总零售价格背景颜色 | 示例6.16 | 见上述示例6.16代码 |
| 突出显示对角线上的数据 | 示例6.18 | 见上述示例6.18代码 |
| 设置表头颜色 | 示例6.19 - 6.25 | 见上述示例6.19代码 |
设置
LINE
语句样式
| 示例6.26 - 6.27 | 见上述示例6.26代码 |
超级会员免费看
5

被折叠的 条评论
为什么被折叠?



