公告

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

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


2007年7月16日 星期一

SAS/GRAPH 101

原文載點:http://www.nesug.info/Proceedings/nesug06/io/io11.pdf

這一篇發表於 NESUG 2006 的技術文件,是我在眾多 SUGI 文章中看到稍微有詳盡介紹 PROC GPLOT 語法的文章。免除繁瑣的背誦語法,作者用 step by step 的方式帶領初學者入門。雖然沒有辦法在短短的文件裡面把每一個 PROC GPLOT 語法和使用方式都教一遍,但以我多年來看過不少 PROC GPLOT 教學文件的經驗來看,這一篇相當值得拿出來當作入門教材。

文內使用了一個取名為「t112」的資料,這是美國和其他國家於 1970~2000 年每年在健康保健花費。如下所示:

data t112;
input year nh_tot fg_tot @@;
cards;
1970 74.4 17.7 1971 82.3 20.4
1972 92.3 22.9 1973 102.5 25.2
1974 116.1 30.5 1975 132.9 36.4
1976 152.2 42.9 1977 172.0 47.6
1978 193.7 54.3 1979 217.2 61.4
1980 250.1 72.0 1981 290.2 84.0
1982 326.1 93.3 1983 358.6 103.2
1984 389.6 112.6 1985 422.6 123.6
1986 454.8 133.1 1987 494.1 144.0
1988 546.0 156.7 1989 602.8 175.0
1990 666.2 195.4 1995 990.2 322.4
2000 1309.4 416.0
;
run;


我們就利用這筆資料,一個步驟一個步驟來解釋如何利用 PROC GPLOT 繪製精緻的圖形。

步驟一:描點

無論是用什麼軟體作圖,一開始要學的一定是如何描點。此步驟以繪製每一年(year:X軸)的美國健康保健花費(nh_tot:Y軸)的散佈圖當作開始吧!

proc gplot data=t112;
plot nh_tot*year;
run;


在 PROC GPLOT 裡面,plot statement 很直覺得就是進行繪圖的語法。在 SAS/GRAPH 中,要畫任何座標圖,一定要先定義 Y 軸,然後才定義 X 軸。以上面的程式為例,nh_tot 會被繪製成 Y 軸,而 year 會被繪製成 X 軸。由於沒有在加上其他的語法或選項,這種 PROC GPLOT 就會描繪出最基本的點散佈圖,如下所示:


步驟二:連線

有了點之後,接下來可以考慮把他們連起來。此時需要加上 symbol statement 來進行連線的動作。

symbol1 value=dot interpol=join;
proc gplot data=t112;
plot nh_tot*year;
run;


關於 symbol statement,有幾點要說明:
一、如果只有一條線要繪製,則可以不用在 symbol 後面加上數字標號。以此例子來說,直接寫成 symbol value=dot interpol=join; 即可。如果有兩條線以上,則可用 symbol1、symbol2、symbol3 .... etc 來表示不同線。
二、value 可簡寫成 v,表示點的形狀。dot 表示黑色實心圓點。想要使用其他不同形狀的點,可以使用STAR(星狀), PLUS(加號), SQUARE(方塊), DIAMOND(菱形), TRIANGLE(三角形), etc。
三、interpol 可簡寫成 i,表示連線的方式。join(可簡寫成 j)表示直線連結。其他不同的連結方式包含 NEEDLE、STEP、SPLINE、R 等等。

因此,繪製出來的圖形如下所示:


步驟三:加上標題和註腳

加上標題得使用 title statement,這和其他 PROC 程序要加上標題的方法一模一樣。加上註腳則需使用 footnote statement。程式如下:

symbol1 v=dot i=join;
title "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year;
run;


圖形如下所示:


步驟四:使用 GOPTIONS 指令來控制文字型態和大小

如果覺得 SAS 內部預設的字型太醜,或是想要大一點的字體,可用 GOPTIONS 指令。

goptions ftext='Arial' htext=2 gunit=pct;
symbol1 v=dot i=join;
title "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year;
run;


此處我們將自行設定成 Arial,大小設定成 2,則圖內所有的字都會被統一成 Arial 大小為 2 的字型,如下所示:


步驟五:設定標題大小和註腳位置

經過步驟四之後,可以發現標題的字體有點小,我們可以利用 height 選項單獨去放大標題大小。如果註腳想放在圖形右下角,則可使用 justify 選項去移動註腳位置。程式如下:

goptions ftext='Arial' htext=2 gunit=pct;
symbol1 v=dot i=join;
title height=4 "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote justify=right "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year;
run;


附帶一提,height 可以簡寫成 h,justify 可以簡寫成 j。

圖形如下所示:


步驟六:設定座標軸文字和角度

通常我們需要圖形座標軸要有明確的標示,並將 Y 軸轉置九十度。可利用 axis 語法來進行設定,程式如下所示:

goptions ftext='Arial' htext=2 gunit=pct;
symbol1 v=dot i=join;
axis1 label=(angle=90 "AMOUNT (IN BILLIONS)");
title h=4 "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year/vaxis=axis1;
format nh_tot comma.;
run;


axis 語法和 symbol 語法一樣,如果只有一個軸需要設定,那可以不用在 axis 後面標上數字。label 選項可以在括弧內用雙引號打上想要顯示的內容(如本例的 AMOUNT (IN BILLIONS))。另外,angle 選項就是來控制 label 的角度。以 90 為例,表示 Y 軸文字逆時針旋轉九十度。要讓 axis1 的設定套在 Y 軸上,就需要在 plot 後面加上 vaxis 選項,然後把 axis1 分配上去即可。如果是要套到 X 軸上,則改用 haxis 選項。額外一提,format 語法只是讓 nh_tot 的格式改變成每三個數字(即千位)就打上一個逗點。如 1000 就會變成 1,000。圖形如下所示:


步驟七:同時改變 X 軸和 Y 軸設定

如同步驟六所說,我們可以用 axis1 和 axis2 來一次設定兩個軸,然後分別套在 plot 語法後面的 vaxis 和 haxis 選項。除此之外,座標軸的刻度也是可以改變的。先看程式:

goptions ftext='Arial' htext=2 gunit=pct;
symbol1 v=dot i=join;
axis1 label=(angle=90 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4);
title h=4 "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year/vaxis=axis1 haxis=axis2;
format nh_tot comma.;
run;


在 axis1 後多了一個 minor=(n=3) 的程式,表示在每個大刻度裡面安插三個小刻度。這個設定會套用到 Y 軸上。而在 X 軸上,則是在每個大刻度裡面安插四個小刻度。至於 axis2 後面的 order 指令,則是控制大刻度標示的顯示方式。以此為例,表示 X 軸將從 1970 年開始,每五年劃上一個大刻度(並標示年代),直到 2000 年為止。圖形如下所示:



步驟八:著色

著色的語法相當簡單。如果是要統一所有文字的顏色,則可在 GOPTIONS 裡面使用 ctext=[顏色名] 來定義文字顏色。如果想要改變座標軸或是描點的顏色,則只要在 symbol 或 axis 語法後面使用 color=[顏色名] 即可。

goptions ftext='Arial' htext=2 gunit=pct ctext=green;
symbol1 v=dot i=join c=blue h=2.5;
axis1 label=(angle=90 "AMOUNT (IN BILLIONS)") minor=(n=3) color=blue;
axis2 order=(1970 to 2000 by 5) minor=(n=4) color=blue;
title1 h=4 "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote1 j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year/vaxis=axis1 haxis=axis2;
format nh_tot comma.;
run;


這個程式主要是將所有文字變成綠色,然後座標軸變成藍色。由於 ctext 和 color 是同性質的語法。所以後宣告的語法會蓋掉先宣告的語法的設定。因此,縱使所有的文字都已經先變成了綠色,但之後宣告座標軸是藍色時,座標軸文字也會變成藍色。如下圖所示:



步驟九:只更改座標軸顏色,不更改座標軸文字顏色

如果要讓座標軸和座標軸文字採用不同顏色,則不能使用步驟八的方法。程式如下:

goptions ftext='Arial' htext=2 gunit=pct ctext=green;
symbol1 v=dot i=join c=blue h=2.5;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3) ;
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
title h=4 font='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot nh_tot*year/vaxis=axis1 haxis=axis2 caxis=blue;
format nh_tot comma.;
run;


作法相當簡單!先照舊統一所有文字顏色(用 ctext),然後不要在 axis1 和 axis2 後面使用 color 選項,而是在 plot 語法後面加上 caxis=[顏色名] 的選項,這樣就可以在不更動座標軸文字顏色的情況下更改座標軸顏色。至於 axis2 後面的 offset 選項,則是讓兩邊的座標軸挪出一點空間。我們可以從下圖看到新的設定:



步驟十:新增圖形

前九個步驟大概可以把美國每一年健康保健花費的趨勢圖畫的很不錯。現在,準備將其他國家每年的健康保健花費的圖形也描繪上去。程式如下:

goptions ftext='Arial' htext=2 gunit=pct ctext=green;
symbol1 v=dot i=join c=blue h=2.5;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3) ;
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue;
format nh_tot comma.;
run;


想要將兩種不同的圖形繪製在同一張圖上,可以在 plot 語法後面使用 (Y1 Y2 Y3 ....)*X 的手法,並在「/」後面加上 overlay(重疊)的選項。如此一來,數個不同的圖形就會重疊在同一張圖上。以此資料為例,nh_tot 和 fg_tot 一起被描繪在圖上。特別注意一點,由於之前我們是使用 symbol1 來控制第一個圖形的設定,因次 symbol1 的設定會完全套用在 nh_tot(因為這是第一個宣告的 Y 值),而不會套用在 fg_tot。SAS 會將圖形預設套用在 fg_tot 上。如果想要兩個 Y 都套用同一個圖形設定,那就使用 symbol,後面不要加數字即可。圖形如下:



步驟十一:設定第二個圖形

如同之前對於 symbol 語法的敘述,我們可用 symbol1, symbol2, ..., symboln 來設定 n 個不同的圖形。針對此例的 fg_tot,我們用 symbol2 來控制。

goptions ftext='Arial' htext=2 gunit=pct ctext=green;
symbol1 v=dot i=join c=blue h=2.5 l=1;
symbol2 v=dot i=join h=2.5 l=3;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue;
format nh_tot comma.;
run;


在 symbol2 中,我們設定大小是 2.5 的實心黑色圓點。線條形狀是第三號(l=3)。關於線條號碼所代表的線條形狀,需要去翻閱 SAS 使用手冊。有十多條不同的線可供選擇。設定好後的圖形如下:



步驟十二:統一描點

如果想要一次統一所有點和線的顏色,我們不需要在每個 symbol 後面打上 color 選項來設定,可用 GOPTIONS 的 csymbol=[顏色名] 來統一控制,程式如下:

goptions ftext='Arial' htext=2 gunit=pct ctext=green csymbol=blue;
symbol1 v=dot i=join h=2.5 l=1;
symbol2 v=dot i=join h=2.5 l=3;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue;
format nh_tot comma.;
run;


如此一來,如下圖所示,所有的點和線都是藍色的了。



步驟十三:增加圖例

在 plot 語法後面使用 legend 選項,可以自動產生圖例在圖形下方。

goptions ftext='Arial' htext=2 gunit=pct ctext=green csymbol=blue;
symbol1 v=dot i=join h=2.5 l=1;
symbol2 v=dot i=join h=2.5 l=3;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue legend;
format nh_tot comma.;
run;




步驟十四:修改圖例


如果覺得 SAS 預設的圖例很醜,可以如同 symbol 和 axis 一樣地進行細部修改,程式如下:

goptions ftext='Arial' htext=2 gunit=pct ctext=green csymbol=blue;
symbol1 v=dot i=join h=2.5 l=1;
symbol2 v=dot i=join h=2.5 l=3;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
legend1 label=none value=(j=left "TOTAL" j=left "FEDERAL GOVT")
mode=protect position=(top inside left)
cborder=blue cshadow=blue
across=1 shape=line(10);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue legend=legend1;
format nh_tot comma.;
run;


有關細部設定的說明如下:
  • label:可設定圖例標題,此例的設定是 none,所以不會顯示任何圖例標題
  • value:可設定圖例說明的位置和文字敘述。j=left 表示文字置左,後面跟的文字則是會顯示在圖例上。打上的文字和其位置會依序從上到下顯示出來
  • mode:用來控制圖例和圖形重疊時的相關位置。mode=protect 會保證圖形和圖例重疊時,圖形一定會顯示在圖例的上面。如此一來可以保證圖形不會被圖例蓋到
  • position:用來設定圖例位置。top inside left 表示圖例會顯示在圖形框內的左上方位置
  • across:圖例中使用的欄位數。本例只使用一欄,所以設定為 1
  • shape:圖例中圖示的形狀。本例使用 Line(10),表示顯示長度為 10 的線
設定好 legend1 之後,把他寫進 plot 語法裡面的 legend 選項裡面即可套用。圖形如下所示:



步驟十五:設定兩條不同的線


這個步驟其實沒有什麼太特別的地方,只是改變兩條線上得點。其他的設定大都和步驟十四相同。

goptions ftext='Arial' htext=2 gunit=pct ctext=green csymbol=blue;
symbol1 v=dot i=join h=2.5 l=1;
symbol2 v=dot i=join h=2.5 l=3;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
legend1 label=none value=(j=left "TOTAL" j=left "FEDERAL GOVT")
mode=protect position=(top inside left)
cborder=blue cshadow=blue
across=1 shape=line(10);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue legend=legend1;
format nh_tot comma.;
run;


此程式在 legend1 多寫了幾個設定,說明如下:
  • cborder:設定圖例外框顏色
  • cshadow:設定圖例陰影顏色
結果如下所示:



步驟十六:打上圖形註釋標記

如果想要在圖形旁邊打上註釋標記,可以使用 annotate 指令來完成。不過,annotate 不像 symbol,axis 或 legend 一樣,可以在後面加上很多選項來進行設定,而是要另外產生一個資料集,把所有註釋設定全部寫進這個資料裡面,最後再套用。這個過程相當複雜,讓我們先看程 式:

data my_labels;
retain xsys ysys '2' function 'label' position '1' style "'Arial/bo'" color 'blue' cborder 'blue';
set t112 end=last;
if last then do;
text=' FEDERAL GOVERNMENT '; x=year; y=fg_tot; output;
text=' TOTAL ' ; x=year; y=nh_tot; output;
end;
run;

goptions ftext='Arial' htext=2 gunit=pct ctext=green csymbol=blue;
options validvarname=upcase;
symbol1 f=marker v='C' i=join h=1.25;
symbol2 f=marker v='U' i=join h=1.25;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
proc gplot data=t112;
plot (nh_tot fg_tot)*year/overlay vaxis=axis1 haxis=axis2 caxis=blue annotate=my_labels;
format nh_tot comma.;
run;


程式分成兩部份。其中,第二部份和步驟十五的程式完全一樣,除了 plot 語法後面的 annotate=my_labels。my_labels 是一個註釋資料集,需利用 data step 的步驟把所有註釋設定存入,這也就是第一部份程式的由來。以下幾點可稍微解釋裡面的寫法:
  • retain:用來保留所有系統變數名稱。之後的 xsys、ysys、function、position、color 等都是系統變數
  • xsys 和 ysys:用來設定整個座標軸系統的位置
  • function:用來設定各種不同的標記動作。以本例來看,設定 function 為 label,表示要進行打上標籤的動作。其他可使用的標記動作計有 bar、comment、draw、frame、move、pie、point 等等
  • style:用來設定標記的型態。本例是設定標記的字型
  • color:設定標記文字顏色
  • cborder:設定標記外框顏色
  • 把原始資料 t112 給叫進來,並把最後一筆資料設定成 end=last。如此一來,所有的標記設定會顯示在最後一個點上
  • if last then do 會在最後一筆資料上寫上所有標記設定
最後把 my_labels 生成好,並套用到 annotate 裡面,就可以產生下面的圖形:



有關 annotate 的用法,其實並沒有辦法用這三言兩語解釋完畢。我會去尋找看看有沒有專門介紹 annotate 的技術文件,改天再放上來。

步驟十七:輸出成 GIF 圖檔格式

要把圖形輸出並存成 GIF 圖檔格式,需要在 GOPTIONS 語法之下進行一些設定。程式如下:

goptions device=gif gsfname=gout xpixels=1024 ypixels=768
ftext='Arial' htext=2 gunit=pct ctext=green csymbol=blue;
symbol1 f=marker v='C' i=join h=1.25;
symbol2 f=marker v='U' i=join h=1.25;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
legend1 label=none value=(j=left "TOTAL" j=left "FEDERAL GOVT")
mode=protect position=(top inside left)
cborder=blue cshadow=blue
across=1 shape=symbol(6,1.25);
title h=4 f='Arial/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
filename gout 'z:\healthexp.gif';
proc gplot data=t112new;
plot exp*year=expsrc/vaxis=axis1 haxis=axis2 caxis=blue legend=legend1;
format exp comma.;
run;


其中:
  • device:設定輸出格式
  • gsfname:圖形會存在 gout 這個 library 內
  • xpixels:設定圖長
  • ypixels:設定圖寬
  • filename:把 gout 裡面的圖存到 z:\healthexp.gif
步驟十八:存成 PDF 檔

這個步驟,其實我早在之前談到有關 ODS 檔案輸出的文章就有談到,因此在此不多加敘述,直接秀程式:

goptions ftext='Helvetica' htext=2 gunit=pct ctext=green csymbol=blue rotate=landscape;
symbol1 f=marker v='C' i=join h=1.25;
symbol2 f=marker v='U' i=join h=1.25;
axis1 label=(angle=90 rotate=0 "AMOUNT (IN BILLIONS)") minor=(n=3);
axis2 order=(1970 to 2000 by 5) minor=(n=4) offset=(2,2);
legend1 label=none value=(j=left "TOTAL" j=left "FEDERAL GOVT")
mode=protect position=(top inside left)
cborder=blue cshadow=blue
across=1 shape=symbol(6,1.25);
title h=4 f='Helvetica/bo' "NATIONAL HEALTH CARE EXPENDITURES: 1970-2000";
footnote j=right "Source: Health-United States-2003";
ods listing close;
ods pdf file='z:\healthexp.pdf' notoc;
proc gplot data=t112new;
plot exp*year=expsrc/vaxis=axis1 haxis=axis2 caxis=blue legend=legend1;
format exp comma.;
run;
ods pdf close;
ods listing;


最後,還有兩個步驟(步驟十九和步驟二十),主要是在講如何一次生出很多張圖,或是把很多張圖擺在一張圖上。其中介紹了兩個 macro,但我個人並不覺得這兩個 macro 有多好用。因此在此不多加介紹。

總而言之,要搞懂 SAS/GRAPH 是一個很耗時的工作。所謂「師父領進門,修行看個人」,希望這個入門文件能讓新手能夠輕鬆上手。又所謂「頭過身就過」,我相信只要把這份入門文件弄熟,要學會高階的 SAS/GRAPH 語法,應該不是什麼難事。

CONTACT INFORMATION
Either of the authors can be contacted using e-mail...
Mike Zdeb msz03@albany.edu
Robert Allison Robert.Allison@sas.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; }