2008年1月27日

把多張圖放在一頁,同時轉成PDF檔

如何把多張圖片放在一頁裡面,這算困擾我很久的問題,當然我知道Greplay可以用,大致上我也會用,但我總覺得預設的template不是很好用,終於在SUGI發現了Kevin P. Delaney寫的文章,不只簡單教了如何把多張圖片放在同一頁上,還教如何將圖片轉成PDF檔。

主要參考文章:
Multiple Graphs on One Page: The Easy Way (PDF) and the Hard Way (RTF)
ODS LAYOUT: Arranging ODS Output as You See Fit

先提如何將圖片放在一個PDF檔案中,其實語法相當的簡單。可以分為三步驟,1:打開一個PDF檔案。2:想要畫的SAS圖形。3:完成繪圖把該PDF檔關閉。

1:ODS PDF file="你想放的路徑(例如:c:\temp\graph.pdf)";
2:SAS/Grasph 語法;
3:ODS PDF close;

來做一個簡單的範例,先產生一堆在不同自由度下T分佈的機率吧。

data t (drop=i j);
   do j=1 to 30 by 2;

      do i=-3 to 3 by 0.1;
         df=j;
         x=i;
         y=probt(x,df);
         output;
      end;
   end;
run;


接者用Gplot把圖畫出來然後放一個PDF檔中。

options nodate nonumber;
goption reset=all device=pdfc;
ods pdf file="C:\temp\CHart\chart_test_1.pdf" STARTPAGE=never;

   proc gplot data=t;
      title2 "Chart1"; 
     where df le 15;
      plot y*x=df;
      symbol1 i=l;
   run;quit;
ods pdf close;


我這裡只把DF小於15的資料畫出來。其實這樣就簡單完成把圖形放置PDF檔中的語法了,比較特別需要說明的為device=pdfc,這指令是和SAS說在PDF檔中圖片的格式,作者覺得pdfc的格式在PDF檔案中會有比較好的效果,相對於GIF或其他的圖片格式。



過來就是重頭戲了,如何把多張圖片放在一頁,在文中作者教了至少4中方法,我這裡只說明ODS LAYOUT這個指令,Layout是在SAS V9或V9.1才有的指令,我覺得還滿簡單的,相對於要去修改Greplay的版模。

在畫圖之前先簡單說明LAYOUT我會的語法。

ods layout Start width=20cm height=28cm;
ods region x=0% y=5% width=45% height=45%;
/*SAS/Graphs 語法1*/

ods region x=51% y=5% width=45% height=45%;
/*SAS/
Graphs 語法2*/

ods region x=0% y=51% width=45% height=45%;
/*SAS/
Graphs 語法3*/

ods region x=51% y=51% width=45% height=45%;
/*SAS/
Graphs
語法4*/

ods layout end;


ODS LAYOUT:Start就是宣告我們要開始使用layout的指令,請想像我們手上拿一張白,width就是設定紙的寬度,我設定了20公分,height設定紙的高度,我設定28公分。

ODS REGION:宣告我下面的圖片要放在那個位置,
『x=51% y=5%』是說我將圖片要放在由左上角算起,整張紙X軸的第51%和Y軸上第5%的交叉點,當然這裡也可以用實際的長度單位來設定,例如x=11cm y=1cm。
『width=45% height=45%』設定我這一張圖片的大小,我是用相對長度,為整張紙45%寬度和紙長45%的長度,同樣也可以設為實際長度,如width=8cm height=10cm。
ods layout end:這也是必要語法,宣告上面的ODS LAYOUT設定結束。

依序設計這四張圖片想要放的位置就完成了,我隨意將剛剛製造的資料檔分成四張圖繪製,然後配合上面的語法就可完成我想要的工作了,完整的程式如下:


options nodate nonumber;
goption reset=all device=pdfc ;
ods pdf file="C:\temp\CHart\chart_test_2.pdf" STARTPAGE=never;

   ods layout Start width=20cm height=28cm;
   symbol1 i=l;

   ods region x=0% y=5% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart1';
      where df le 5;
      plot y*x=df/noframe;
   run;

   ods region x=51% y=5% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart2';
      where df ge 5 and df le 15;
      plot y*x=df/noframe;
   run;

   ods region x=0% y=51% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart3';
      where df ge 15 and df le 25;
      plot y*x=df/noframe;
   run;

   ods region x=51% y=51% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart4';
      where df ge 25 and df le 30;
      plot y*x=df/noframe;
   run;quit;

   ods layout end;
ods pdf close;


結果如下圖:




利用PDF輸出和ODS LAYOUT的指令理論上就在一頁可繪製出多張高品值的圖形了,當然ODS LAYOUT應用不只用於圖形,想要結合表格和圖形,也是很OK的啦。

沒有留言:

張貼留言