公告

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

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


2008年10月14日 星期二

A Legend is Not Just a Legend

原文載點:http://www.nesug.org/Proceedings/nesug07/po/po21.pdf

這是一篇關於介紹 SAS/GRAPH 裡面圖例(legend)的基本寫法和一些變化,由 Wendi Wright 在 NESUG 2007 所發表。

假設有個程式如下所示:
TITLE font=’Times New Roman’ height=1.5 ‘Number of Hits on Websites 1, 2, and 3’;
TITLE2 font=’Times New Roman’ height=1.5 ‘For the Month of ‘ COLOT=red ‘March 2007’;
FOOTNOTE JUSTIFY=left ‘Educational Testing Service’ JUSTIFY=right ‘April 1, 2007’;
AXIS1 LABEL=(ANGLE=270 ROTATE=90 HEIGHT=1.5 ‘Number of Hits’)
ORDER=(0 to 1800 by 200) MINOR=(NUMBER=3);
AXIS2 REFLABEL=(POSITION=top JUSTIFY=center ‘Email Ad‘)
VALUE=(‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘7’ ‘8’ ‘9’);
SYMBOL1 COLOR=blue INTERPOL=join LINE=1 VALUE=dot;
SYMBOL2 COLOR=red INTERPOL=join LINE=2 VALUE=star;
SYMBOL3 COLOR=green INTERPOL=join LNEe=3 VALUE=circle;
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2;
RUN;

能夠畫出這樣的圖:

以此圖為基準,我們來看看如果加上圖例,並且做一些變化。

最基本的圖例就是依照 SAS 內部的設定將三條折線的點和線的型態標註在整張圖的最下方。這個動作只需要在 plot statement 後面加上 legend 即可,如下所示:
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND;
Run;

SAS 會輸出下面這種圖:

如果想要換掉 legend 裡面三條折線的標籤,則可以在 PROC GPLOT 程序前面加上一條 legendn 的指令來修改。其中 n=1,2,3... 表示可以寫 n 條 legend 的指令。之後再把寫好的 legend statement 掛在 legend option 的後面,如下所示:
LEGEND1 VALUE=(COLOR=blue HEIGHT=1 ‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’);
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
Run;

在 legend1 指令中,value 可以設定標籤的顏色(color option)、大小(height option)還有標籤字樣(此例用 'Web Site 1' 'Web Site 2' 'Web Site 3',記得要加引號,不要加逗號)。改好後得圖例會變成這樣:

如果也想一併把 legend 的名字(此例為「PLOT」)改掉,則可使在 legendn 指令裡面再加上一個 label 的選項,如下所示:
LEGEND1 LABEL=(COLOR=blue HEIGHT=2 ‘Our Web Pages’)
VALUE=(COLOR=blue HEIGHT=1 ‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’);
PROC GPLOT data=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
Run;

同樣地,label 裡面也可以設定顏色大小和想要用的字,語法和 value 一模一樣。改出來的效果如下所示:


如果不想讓 legend 橫的排列,而想改成直的,則需使用 across 和 down 兩個選項控制。across 可以表示行數,down 可以表示列數。因此此例要讓 legend 直的排,就等於是要宣告 legend 裡面只要一行三列,程式改寫如下:
LEGEND1 LABEL=(HEIGHT=1 ‘Our Web Pages’)
VALUE=(‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’)
ACROSS=1 DOWN=3;
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS axis2 LEGEND=legend1;
Run;

此時 legend 就會站起來了!


若覺得這樣還不夠,想要讓 legend 名稱「Our Web Pages」也放在圖例的上頭,則需要在 legend 裡面的 label option 多加兩個指令。一個是 position,用來指定 legend 名稱的位置,有上下左右(top, bottom, left, right)可選,然後再用 justify 指令來對齊,有置左(left)、置中(center)、和置右(right)可選。程式如下:
LEGEND1 LABEL=(HEIGHT=1 POSITION=top JUSTIFY=center ‘Web Sites’)
VALUE=(‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’)
ACROSS=1 DOWN=3;
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
Run;

此程式是將他放在上頭並置中,所以用 position=top 和 justify=center 來調整。結果如下:


若覺得這樣的圖例太大很佔空間,想要把他移到圖內,只要在 position 裡面加上一個 inside 選項即可。如果要把圖例移到左上角,則可以再同時宣告 top 和 left 於 position 裡面。換句話說,position 可以一次宣告三種位置。另外,如果擔心圖例會遮到既有的點或線,則可以使用 mode 來決定要不要覆蓋。要的話設定為 protect,不要的話則設定為 share。此例設定為要覆蓋,所以使用 mode=protect。程式改寫如下:
LEGEND1 LABEL=(HEIGHT=1 POSITION=top JUSTIFY=center ‘Web Sites’)
VALUE=(‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’)
ACROSS=1 DOWN=3
POSITION = (top left inside)
MODE=protect;
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
Run;

圖形如下:


如果覺得這個 legend 太單調,想要多加一個有顏色的框,則需使用 cframe 來設定顏色,如下所示:
LEGEND1 LABEL=(HEIGHT=1 POSITION=top JUSTIFY=center ‘Web Sites’)
VALUE=(‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’)
ACROSS=1 DOWN=3
POSITION = (top left inside)
MODE=protect
CFRAME = yellow;
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLYA HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
Run;

然後你就會得到一個黃色的框架:


當然框架也是可以做一些微調的,比方說若覺得他太靠近 Y 軸的話,可利用 offset 來進行調整。以此圖為例,如果想要將 legend 框架和 Y 軸拉開差不多整張圖的 3% 的距離,則可以下列程式:
LEGEND1 LABEL=(HEIGHT=1 POSITION=top JUSTIFY=center ‘Web Sites’)
VALUE=(‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’)
ACROSS=1 DOWN=3
POSITION = (top left inside)
MODE=protect
CFRAME= yellow
OFFSET = (3 pct);
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
Run;

成效如下:

特別一提的是,這種調整通常很難一次到位,所以使用者需要輸入不同的數值以求達到自己最滿意的結果。

這框架也可以更改長寬大小,只要在 legend 裡面使用 shape=(w,h) 語法就可設定,其中 w 代表寬度,h 代表高度。預設值是 (w,h)=(5,1)。此例若要加長寬度,則需用 shape=(10,1),如下所示:
LEGEND1 LABEL=(HEIGHT=1 POSITION=top JUSTIFY=center ‘Web Sites’)
VALUE=(‘Web Site 1’ ‘Web Site 2’ ‘Web Site 3’)
ACROSS=1 DOWN=3
POSITION = (top left inside)
MODE=protect
CFRAME = yellow
OFFSET = (3 pct)
SHAPE=(10,1);
PROC GPLOT DATA=perm.hits;
PLOT Web1*day Web2*day Web3*day
/ OVERLAY HREF = ‘17’ FRAME VAXIS=axis1 HAXIS=axis2 LEGEND=legend1;
RUN;



當然 legend 指令還有很多,不過這些基本的設定可以應付大部分的情況,如果想要再深入研究其他指令,可以依照下面的路徑去找網路上的手冊:

AUTHOR CONTACT
Your comments and questions are valued and welcome. Contact the author at:
Wendi L. Wright
1351 Fishing Creek Valley Rd.
Harrisburg, PA 17112
Phone: (717) 513-0027
E-mail: wendi_wright@ctb.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; }