创建附加在一起的所有条形图的 pdf
create a pdf of all bar-line plots appended together
我使用 proc gbarline 创建了一系列图,我希望将所有图导出为一个 pdf 而不仅仅是第一个图,我有两个问题:
除非我将第一个图打印两次,否则该图不会导出为 pdf,因此我使用语句
的原因
%if &index. = 1 %then %do;
<statements>;
%end;
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\_×tamp._&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 目标已经关闭。
我使用 proc gbarline 创建了一系列图,我希望将所有图导出为一个 pdf 而不仅仅是第一个图,我有两个问题:
除非我将第一个图打印两次,否则该图不会导出为 pdf,因此我使用语句
的原因%if &index. = 1 %then %do; <statements>; %end;
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\_×tamp._&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 目标已经关闭。