创建附加在一起的所有条形图的 pdf

create a pdf of all bar-line plots appended together

我使用 proc gbarline 创建了一系列图,我希望将所有图导出为一个 pdf 而不仅仅是第一个图,我有两个问题:

  1. 除非我将第一个图打印两次,否则该图不会导出为 pdf,因此我使用语句

    的原因
    %if &index. = 1 %then %do;
    <statements>;
    %end;
    
  2. pdf 仅包含第一个情节

我使用的代码如下:

%macro test_pdf;

    data snp (drop=i);
        do i = 1 to 100;
            y = ranuni(0);
            x1 = ranuni(0) * 5;
            x2 = ranuni(0) * 10;
            x3 = ranuni(0) * 7;
            x4 = ranuni(0) * 4;
            x5 = ranuni(0) * 100;
            x6 = ranuni(0) * 50;
            x7 = ranuni(0) * 1000;
            x8 = ranuni(0) * 10000;
            x9 = ranuni(0) * 9999;
            x10 = ranuni(0) * 5984;
            x11 = ranuni(10) * 5;
            x12 = ranuni(10) * 10;
            x13 = ranuni(10) * 7;
            x14 = ranuni(10) * 4;
            x15 = ranuni(10) * 100;
            x16 = ranuni(10) * 50;
            x17 = ranuni(10) * 1000;
            x18 = ranuni(10) * 10000;
            x19 = ranuni(10) * 9999;
            x20 = ranuni(10) * 5984;
            x21 = ranuni(20) * 5;
            x22 = ranuni(20) * 10;
            x23 = ranuni(20) * 7;
            x24 = ranuni(20) * 4;
            x25 = ranuni(20) * 100;
            x26 = ranuni(20) * 50;
            x27 = ranuni(20) * 1000;
            x28 = ranuni(20) * 10000;
            x29 = ranuni(20) * 9999;
            x30 = ranuni(20) * 5984;
            x31 = ranuni(30) * 5;
            x32 = ranuni(30) * 10;
            x33 = ranuni(30) * 7;
            x34 = ranuni(30) * 4;
            x35 = ranuni(30) * 100;
            x36 = ranuni(30) * 50;
            x37 = ranuni(30) * 1000;
            x38 = ranuni(30) * 10000;
            x39 = ranuni(30) * 9999;
            x40 = ranuni(30) * 5984;
            output;
        end;
    run;

    PROC CONTENTS DATA = snp OUT = snp_contents NOPRINT;
    RUN;

    PROC SQL NOPRINT;
        SELECT name INTO: snp_factors 
            separated by " " 
        FROM snp_contents
            WHERE varnum > 1;
        SELECT name INTO: snp_response
            FROM snp_contents
                WHERE varnum = 1;
        SELECT max(length(name)) INTO: max_length
            FROM snp_contents;
    QUIT;

    ODS HTML CLOSE;
    ODS HTML;
    QUIT;

    %LET timestamp = %sysfunc(putn(%sysfunc(date()),yymmddn8.));
    %LET hourstamp = %sysfunc(compress(%sysfunc(TIME(),time.),%str( :)));
    ODS TRACE ON;
    ODS PDF FILE = "&ROOT\output_data\_&timestamp._&hourstamp._Histogram_gbarline.pdf";
    ODS SELECT gbarlin;
    %LET index = 1;

    %DO %UNTIL (%SCAN(&snp_factors.,&index.," ")=);
        %LET factors = %SCAN(&snp_factors.,&index.," ");

        %IF &index. = 1 %THEN
            %DO;

                PROC GBARLINE DATA=snp
                ;
                    BAR  &factors.
                        /
                        FRAME LEVELS=10
                        TYPE=PCT
                        MISSING
                        COUTLINE=BLACK
                    ;
                    PLOT / SUMVAR=&snp_response.
                        TYPE=MEAN
                    ;
                RUN;

                QUIT;

            %END;

        PROC GBARLINE DATA=snp
        ;
            BAR  &factors.
                /
                FRAME LEVELS=10
                TYPE=PCT
                MISSING
                COUTLINE=BLACK
            ;
            PLOT / SUMVAR=&snp_response.
                TYPE=MEAN
            ;
        RUN;

        QUIT;

        ODS PDF CLOSE;
        %LET index = %EVAL(&Index + 1);
    %END;
%mend;

%test_pdf;

您正在关闭 %DO %UNTIL 循环中的 PDF。

改变

    … 
    ODS PDF CLOSE;
    %LET index = %EVAL(&Index + 1);
%END;

    … 
    %LET index = %EVAL(&Index + 1);
%END;
ODS PDF CLOSE;

因为您在循环内关闭,所以只有第一次迭代出现在 PDF 输出中。循环内的后续 ODS PDF CLOSE 语句被 SAS 接受并被静默丢弃(没有日志消息),因为 PDF 目标已经关闭。