16、SAS报表颜色设置与样式调整全解析

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
  1. 突出显示对角线上的数据 :使用示例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;
  1. 设置表头颜色 :使用 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;
  1. 设置 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代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值