公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2011年5月7日 星期六

Creating High-Quality Scatter Plots: An Old Story Told by the New SGSCATTER PROCEDURE

原文載點:http://support.sas.com/resources/papers/proceedings10/057-2010.pdf

散佈圖算是統計圖表裡面一個很基本的呈現資料分布型態的表示方法,但是用 PROC GPLOT 畫出來的散佈圖不甚美觀。一位辛辛那提大學數學系的中國學生寫了這一篇技術文件,採用了 PROC SGSCATTER 程序,將單純的散佈圖的品質提昇到另一個境地。

資料來源是採用 SAS 裡面現成的資料檔 sashelp.cars,但作者只採用部分的內容:
ods html style=harvest;
data cars;
  set sashelp.cars;
  where make in ('Jeep' 'Chevrolet' 'Ford' 'Chrysler');
run;
變數的定義如下:

接下來所有的範例都會被 ODS 輸出成 html 的格式,採用了 harvest 的風格。如果你不喜歡 harvest 的風格,還有其他三種可以選:



範例一
以往用 PROC GPLOT 要畫 Y*(X1 X2) 的圖時,會產生兩張獨立的圖給你。現在用 PROC SGSCATTER 會自動給你合併成一張的圖。
proc sgscatter data=cars;
  plot invoice*(weight length); 
run;


範例二
如果想共用同一條軸,只要把 y= 和 x= 加上去就可以了。這樣可以讓散佈圖可視面積稍大一些。
proc sgscatter data=cars;
  compare y=invoice x=(weight length);
run;


範例三
以前介紹過的散佈矩陣圖。在 PROC SGSCATTER 裡面用 matrix 語法來執行。
proc sgscatter data=cars;
  matrix invoice weight length;
run;


範例四
用 rows= 和 columns= 來指定合併圖時的行列數目。
proc sgscatter data=cars;
  plot invoice*(weight length) / rows=2 columns=1;
run;


範例五
想要知道不同汽車製造商的散佈位置,首先在 plot 語法後面加上一個 group = 的選項,把汽車製造商的變數名稱 make 放入,這樣 PROC SGSCATTER 就會知道要針對那個變數做分組,並且自動替不同的製造商加上不同的顏色和點型。
proc sgscatter data=cars;
  plot MPG_city*weight / group=make;
  where make in ('Ford' 'Chrysler' 'Chevrolet');
  title 'Scatter Plot by Make';
run;


範例六
想要在散佈圖上加上廠商的名稱,則是用 datalabel= 這個選項來處理。
proc sql;
  create table cars2 as
select origin, make, mean(MSRP) as MSRP,
       mean(MPG_city) as MPG_city,
       mean(MPG_highway) as MPG_highway
from sashelp.cars
group by origin, make
order by origin, make;
quit;
proc sgscatter data=cars2;
  plot MSRP*MPG_highway / datalabel=make group=origin grid;
  title 'Averaged MSRP vs. Highway MPG for Car Makers by Origin';
  format MSRP dollar6.0;
  label MSRP='Manufacturer Suggested Retail Price' MPG_highway='Highway MPG';  
run;


範例七
若要加上一條迴歸線以及信賴區間,則用 reg= 的選項來畫。
proc sgscatter data=cars2;
  plot MSRP*MPG_highway / datalabel=make group=origin grid reg=(degree=2 clm nogroup);
  title 'Averaged MSRP vs. Highway MPG for Car Makers by Origin';
  title2 '-- with quadratic regression fitting and conf. intervals --';
  format MSRP dollar6.0;
  label MSRP='Manufacturer Suggested Retail Price' MPG_highway='Highway MPG';  
run;


範例八
要話95%的預測橢圓,則用 ellipse = 的選項來畫。
proc sgscatter data=cars2;
  compare y=MSRP x=(MPG_highway MPG_city) / group=origin ellipse=(alpha=0.05 type=predicted);
  title 'Averaged MSRP vs. Highway/City MPG for car makers by Origin';
  title2 '-- with 95% prediction ellipse --';
  format MSRP dollar6.0;
  label MSRP='Manufacturer Suggested Retail Price'
          MPG_highway='Highway MPG' MPG_city='CITY MPG';  
run;


範例九
回到散佈矩陣圖,如果想要在圖的對角線畫上每個變數的次數分配柱狀圖以及常態曲線,則可用 diagnoal = 的選項處理。
title 'Scatter Plot Matrix with Histograms and Normal Fitting Curves';
proc sgscatter data=cars;
  matrix invoice weight length / diagonal=(histogram normal);
run; quit;


範例十
最後,用 ODS GRAPHICS 設定圖型內部的參數,然後在 ODS HTML 後面加上路徑來讓生出來的圖存到指定位置去。
ods html gpath='C:\' style=harvest; 
ods graphics / reset=all width=12in height=6in border=off imagename='example' imagefmt=png;
proc sgscatter data=cars2;
  plot MSRP*(MPG_highway MPG_city) 
       / datalabel=make group=origin 
         grid reg=(degree=2 clm nogroup);
  title 'Averaged MSRP vs. Highway/City MPG for Car Makers by Origin';
  title2 '-- with quadratic regression fitting and conf. intervals --';
  format MSRP dollar6.0;
  label MSRP='Manufacturer Suggested Retail Price'
          MPG_highway='Highway MPG'
          MPG_city='City MPG';  
run; 
ods html close;
幾個重要的 ODS GRAPHICS 參數在此介紹一下:

  • WIDTH=, HEIGHT=  :設定圖型的長度和寬度
  • IMAGENAME=, IMAGEFMT=  :設定圖型的名稱和格式
  • BORDER=ON|OFF  :設定要不要畫圖型的邊界
  • RESET=ALL   :繪圖結束後重設所有參數



CONTACT INFORMATION
Your comments and questions are valued and encouraged. Contact the author at:
Xiangxiang Meng
Department of Mathematical Science University of Cincinnati
mengxa@mail.uc.edu
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }