公告

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

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


2009年6月11日 星期四

Using PROC SGPLOT for Quick High-Quality Graphs

原文載點:http://support.sas.com/resources/papers/proceedings09/158-2009.pdf

雖然不曉得有多少人已經拿到 SAS V9.2,不過由於我已經拿到了,所以之後會開始陸續介紹一些新版的功能。

首先先來展示一個 V9.2 最新的繪圖程序—PROC SGPLOT。舊版的 SAS 雖然有提供繪圖程序,但是他們都分散在不同的程序裡面,反而造成使用者的不便。此外,他們的老毛病還是存在,那就是畫出來的圖品質不佳,後來雖然有 ODS 的協助,稍微改善了這方面的缺失,不過 V9.2 版把這些舊的繪圖程序都打包在 PROC SGPLOT 裡面。SGPLOT 顧名思義就是 sophisticated graphical plot 的縮寫,讓我們先來看看這個新繪圖程序的功能。

。HISTOGRAMS
舊版的長條圖要用 PROC GCHART 或 PROC NORMAL 裡面的 HISTOGRAM statement 才能畫出,而且還需要加上許多語法。現在在 PROC SGPLOT 裡面只要使用 HISTOGRAM statement,後面加上變數名稱,就可以完成一個精美的長條圖。

範例:

PROC SGPLOT DATA = Freestyle;
   HISTOGRAM Time;
TITLE "Olympic Men's Swimming Freestyle 100";
RUN;
成果:

你拍攝的 image006.jpg。

若想要加上機率密度曲線,則只要多寫一行 DENSITY option,並宣告變數名稱即可。

範例:

PROC SGPLOT DATA = Freestyle;
HISTOGRAM Time;
   DENSITY Time;
TITLE "Olympic Men's Swimming Freestyle 100";
RUN;
成果:

你拍攝的 image008.jpg。

。BAR CHARTS
要畫柱狀圖的的話,原本 PROC GCHART 裡面的 VBAR 和 HBAR 被完全移植過來。

範例:

PROC SGPLOT DATA = Countries;
   VBAR Region;
TITLE 'Olympic Countries by Region';
RUN;
成果:

你拍攝的 image010.jpg。

若想要顯示每根 bar 裡面不同群體所佔的比例,則只要在後面加上 GROUP option 即可。

範例:

PROC SGPLOT DATA = Countries;
VBAR Region / GROUP = PopGroup;
TITLE 'Olympic Countries by Region and Population Group';
RUN;
成果:

你拍攝的 image012.jpg。

如果要計算次數的目標是另一個變數的話,可以用 RESPONSE option來另外累計。

範例:

PROC SGPLOT DATA = Countries;
VBAR Region / RESPONSE = NumParticipants;
TITLE 'Olympic Participants by Region';
RUN;
成果:
你拍攝的 image014.jpg。

。SERIES PLOTS
畫 X-Y 座標圖的功能被整合進 SERIES statement 中。而且重複呼叫 SERIES statement 的話,可以自動完成重疊圖形的功能,不用像以前一樣一定得加上 overlay option。

範例:

PROC SGPLOT DATA = Weather;
   SERIES X = Month Y = BRain;
   SERIES X = Month Y = VRain;
   SERIES X = Month Y = LRain;
TITLE 'Average Monthly Rainfall in Olympic Cities';
RUN;
成果:

你拍攝的 image016.jpg。

接下來看看怎樣替圖形做一些細部的調整。

。XAXIS AND YAXIS STATEMENTS

這兩個 statement 便是拿來更改 X 軸和 Y 軸設定的語法,功能就和以前的 AXISn statement 一樣。從上面的圖可以發現,X-軸代表月份,但是刻度卻是 2.5, 5.0, 7.5, 10.0, 12.5,顯然是不合理的,若加上 TYPE=DISCRETE 則會以實際資料裡面的數據來刻畫度數。GRID 則是在每個刻度上面劃上一條淡灰色的準線。如果 XAXIS 和 YAXIS 都加上 GRID option 的話就可以畫出格狀的底圖。LABEL 自然就是將軸重新命名,而 VALUES 則可以自己定義刻度的起始點和間距大小。

範例:

PROC SGPLOT DATA = Weather;
SERIES X = Month Y = BRain;
SERIES X = Month Y = VRain;
SERIES X = Month Y = LRain;
   XAXIS TYPE = DISCRETE GRID;
   YAXIS LABEL = 'Rain in Inches' GRID VALUES = (0 TO 10 BY 1);
TITLE 'Average Monthly Rainfall in Olympic Cities';
RUN;
成果:

你拍攝的 image018.jpg。

。PLOT STATEMENT OPTIONS
如果想要針對座標軸內的線條圖形或是圖例說明做調整,則需要在 SEREIS statement 後面加上一些 option。LEGENDLABEL 可以更改圖例說明內的標籤,MARKERS 的功能就和以前的 SYMBOL 一樣,可以在資料點上標上符號。LINEATTRS 則是可以規範線條型態和粗細。

範例:

PROC SGPLOT DATA = Weather;
SERIES X = Month Y = BRain / LEGENDLABEL = 'Beijing' MARKERS LINEATTRS = (THICKNESS = 2);
SERIES X = Month Y = VRain / LEGENDLABEL = 'Vancouver' MARKERS LINEATTRS = (THICKNESS = 2);
SERIES X = Month Y = LRain / LEGENDLABEL = 'London' MARKERS LINEATTRS = (THICKNESS = 2);
XAXIS TYPE = DISCRETE;
TITLE 'Average Monthly Rainfall in Olympic Cities';
RUN;
成果:

你拍攝的 image020.jpg。

。REFLINE STATEMENT
如果想要在座標圖上加上一些參考線,則可以 REFLINE statement來完成。同樣地,參考線也可以做一些細部設定,比方說透明度可以用 TRANSPARENCY option 來設定,每條參考線也可以用 LABEL option 寫上標籤。

範例:

PROC SGPLOT DATA = Weather;
SERIES X = Month Y = BRain;
SERIES X = Month Y = VRain;
SERIES X = Month Y = LRain;
XAXIS TYPE = DISCRETE;
REFLINE 2.03 4.78 1.94 / TRANSPARENCY = 0.5 LABEL = ('Beijing(Mean)' 'Vancouver(Mean)' 'London(Mean)');
TITLE 'Average Monthly Rainfall in Olympic Cities';
RUN;
成果:

你拍攝的 image022.jpg。

。INSET STATEMENT
座標圖內可以用 INSET statement 寫上一些註釋文字,至於位置當然就得用 POSITION option 來設定。若要將註釋文字加框,則簡單地用 BORDER option 即可搞定。

範例:

PROC SGPLOT DATA = Weather;
SERIES X = Month Y = BRain;
SERIES X = Month Y = VRain;
SERIES X = Month Y = LRain;
XAXIS TYPE = DISCRETE;
INSET 'Source Lonely Planet Guide'/ POSITION = TOPRIGHT BORDER;
TITLE 'Average Monthly Rainfall in Olympic Cities';
RUN;
成果:

你拍攝的 image024.jpg。

。THE SGPANEL PROCEDURE
以前如果要針對一個資料集裡面不同的群組或個體畫出各自的圖形並且放在同一張圖裡面,是相當大費周章的事情。現在這種苦差事利用 PROC SPGPANEL 程序即可輕鬆解決。假設我們要畫一個資料集的迴歸線,用 PROC SGPLOT 的 REG statement 就可以畫出。程式如下:


PROC SGPLOT DATA=sg.countries;
REG X=NumParticipants Y=TotalMedals;
TITLE 'Number of Participants by Total Medals Won for Each Country';
RUN;
圖形如下:

你拍攝的 image062.jpg。

如果這個資料集裡面共包含六個區域,該如何分別製作迴歸圖,並且用 2X3 排成一張圖。程式如下:

PROC SGPANEL DATA=sg.countries;
PANELBY Region;
REG X=NumParticipants Y=TotalMedals;
TITLE 'Number of Participants by Total Medals Won for Each Country';
RUN;
首先呼叫 PROC SGPANEL,再用 PANELBY statement 定義 Region 是類別變數。這功能就很像 CLASS statement。其餘的程式都和之前的 PROC SGPLOT 一樣,結果如下:

你拍攝的 image064.jpg。

這份技術文件裡面有製作幾個表格,分別說明每種圖形要在 PROC SGPLOT 裡面用哪一種 statement,以及選了一些比較重要的 option,如下所示:





由於裡面的敘述都很簡單,各位可以自行下載原始檔案來看。不過這些語法都只是整個 PROC SGPLOT 裡面的九牛一毛而已,當然如果都學會的話應該也夠用了。如果想要知道全部的語法,可以到 SAS 官網去看。

網址:http://support.sas.com/documentation/cdl/en/grstatproc/61948/HTML/default/sgplot-stmt.htm

ABOUT THE AUTHORS
Lora Delwiche and Susan Slaughter are the authors of The Little SAS Book: A Primer, and The Little SAS Book for
Enterprise Guide which are published by SAS Institute. The authors may be contacted at:
Lora D. Delwiche
(530) 752-9321
llddelwiche@ucdavis.edu

Susan J. Slaughter
(530)756-8434
susan@avocetsolutions.com
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; }