通過GPLOT過程制作圖形
和數據報表一樣,圖形也是展現數據的重要方法,圖形的直觀效果是數據報表無法替代的。SAS/GRAPH是SAS進行數據可視化展現的重 要組成部分,具有強大的作圖功能。可以展現的圖形包括以下這些:
- ·散點圖與連線圖(PLOTS)
- ·圖表(CHARTS)
- ·地圖(MAPS)
- ·三維圖(3D GRAPHICS)
- ·幻燈片(TXET SLIDES)
主要介紹SAS/GRAPH中兩個基本的作圖過程:作圖過程(GPLOT)和圖表過程(GCHART)。讀者有興趣可以參考SAS幫助文檔學習更多的作圖過程。
使用GPLOT過程可以制作平面的散點圖和連線圖。平面的散點圖 就是以數據集中某兩個變量作為縱坐標和橫坐標,以每個觀測為一個數 據點,數據集中的多個觀測就形成一幅散點圖,連線圖就是將分散的數 據點用直線或者曲線連接起來。散點圖和連線圖在分析比較數據的趨勢時比較常用。
1 制作散點圖
使用GPLOT過程制作散點圖的基本語法如下:
PROC GPLOT DATA=數據集; PLOT 縱坐標變量*橫坐標變量; RUN; PLOT語句; … RUN; QUIT;
一個GPLOT過程中可以使用多個RUN語句,並以QUIT語句結尾。 每個RUN語句中也可以使用多個PLOT語句。
- ·在一個PROC語句中使用多個RUN語句,可以針對不同的圖形使用 不同的WHERE語句,利用全局語句定義不同的標題、腳注、坐標軸等 屬性。在SAS/GRAPH中GPLOT、GCHART、GMAP和GSLIDE支持使 用多個RUN語句。
- ·QUIT語句表示結束該PROC步。如果在RUN語句后面出現其他的PROC步或者DATA步,該PROC步也會自動結束。
數據集ex.sales_year中包含了某公司自1998年至今在北美和 歐洲的銷售數據(交易數量和銷售金額)。其中變量如下:年份(Year)、N_Transactions(北美的交易數量)、N_Amount(北美的銷售金額)、E_Transactions(歐洲的交易數量)、E_Amount(歐洲的銷 售金額)。要求制作一個散點圖,顯示每年的北美銷售金額。
proc gplot data=ex.sales_year; title 'Yearly Amount in North America'; plot N_Amount*Year; run; quit;
這是最簡單的散點圖,橫坐標為Year,縱坐標為N_Amount,圖形的元素都使用系統的默認設置,每個數據在圖上顯示為一個“+”號。
1.選項RESET=
由於圖形的展現涉及的方面很多,包括顏色、線型、字體等,因此 圖形選項也很多,在制作圖形時可以使用GOPTIONS語句來控制各種選項。在開始學習制作圖形時,不妨使用選項RESET=ALL,它可使所有的圖形選項都恢復系統默認的設置。需要注意的是,在使用該選項之 后,TITLE語句與FOOTNOTE語句中指定的標題和腳注也將被取消。
2.使用TITLE和FOOTNOTE語句設置標題和腳注和前面制作報表一樣,在作圖時也可以使用TITLE語句和FOOTNOTE語句在圖形上加入標題和腳注。需要注意的是,在 SAS/GRAPH中,TITLE語句和FOOTNOTE語句除了可以設定標題和腳 注的內容以外,還可以對其字體、大小、顏色進行設定。
在制作圖形時,TITLE語句和FOOTNOTE語句的使用形式如下:
TITLEn 選項 '標題內容';
FOOTNOTEn 選項 '腳注內容';
其中n=1~10,缺省時,n默認取值為1。TITLEn和FOOTNOTEn的更 新和置換規則和5.2.3節中介紹的一樣。
將所有TITLE語句和FOOTNOTE語句恢復默認設置的方法有以下兩 種:
- ·GOPTIONS RESET=(TITLE FOOTNOTE);
- ·GOPTIONS RESET=GLOBAL;
TITLE語句和FOOTNOTE語句的常用選項
3.使用SYMBOL語句設置散點屬性
在圖5.27中,如果希望輸出的數據在圖上顯示為一個紅色的圓點,該如何進行設置呢?這時需要使用SYMBOL語句。在GPLOT過程中, SYMBOL語句用來設置散點的符號、顏色等屬性。使用形式如下:
SYMBOLn 選項;
其中,n是不同SYMBOL的序號,取值為1~255,缺省時默認取值為1。SYMBOL語句和TITLE語句一樣是全局語句,可以出現在PROC步 前面或PROC步的程序中間。
將某個SYMBOL語句恢復為默認設置的方法如下:
SYMBOLn;
將所有SYMBOL語句都恢復為默認設置的方法如下:
GOPTIONS RESET=SYMBOL;
在上例的散點圖中,將散點符號換成紅色的“.”。 示例代碼如下:
symbol value=dot cv=red; proc gplot data=ex.sales_year; title f='Albany Amt' c=blue h=3 u=2 'Yearly Amount in North America'; footnote j=r 'Optimization Solution Co. Ltd'; plot N_Amount*Year; run; quit; goptions reset=all;
以上程序使用SYMBOL語句通過選項VALUE=將散點符號設置為圓 點(.),通過選項CV=將散點顏色設置為紅色。並且利用TITLE語句和 FOOTNOTE語句設置了標題和腳注的文字和屬性。
可在SYMBOL語句中用不同的選項來設置不同的屬性,下表是SYMBOL語句中用於設置散點屬性的選項。
2 制作連線圖
在SYMBOL語句可以使用選項INTERPOL=制作連線圖。語法如下:
SYMBOLn INTERPOL=插值方法;
選項INTERROL=可以簡寫為I=。其中插值方法主要有以下幾種。
- ·NONE:表示不作連線圖,這是系統默認取值。
- ·JOIN:表示將數據點按照數據集中出現的順序用直線連接。
- ·SPLINE:表示使用光滑的插值曲線將數據點按照數據集中出現的 順序連接起來,並且使得曲線經過每個數據點。
- ·SMnn:表示用光滑的插值曲線來擬合數據點,曲線可以不經過數據點,nn的取值為0~99,取值越大,插值曲線的光滑程度越高。
- ·Rxyzzzmm:表示根據數據點作回歸線,x表示回歸類型,取值為L、Q、C;y表示回歸線是否過數據點,取值為0、1;zzz表示置信限,取值為CLM、CLI;mm表示置信水平。
- ·NEEDLE:表示針對每個點畫一條從點到橫坐標軸的連線。
- ·STEPxyz:表示制作階梯圖,x表示數據點在階梯上的位置,取值為L、R、C;y表示是否用豎線連接各階梯;z表示是否對數據按橫坐標 變量排序。
同時,SYMBOL語句中還提供了更多的選項來控制連線線型、粗 細、顏色等屬性。如表所示是SYMBOL語句中常用的設置連線屬性的選項。
下面將上圖的散點用藍色的實線連接起來。示例代碼如 下:
symbol value=dot cv=red interpol=join ci=blue; proc gplot data=ex.sales_year; title 'Yearly Amount in North America'; plot N_Amount*Year; run; quit; goptions reset=all;
當定義了多個SYMBOL語句時,可以使用以下語法來指定圖形使用 特定的SYMBOL語句設置的屬性:PLOT縱坐標變量*橫坐標變量=n;
該語句表示該散點圖使用SYMBOLn設置的屬性。
1.使用選項HAXIS=和VAXIS=控制坐標軸取值范圍
在上圖中,可觀察到橫坐標的取值范圍為1990~2020。其實我們 的數據集中年份截止到2012年。如果想使得圖形中橫坐標的取值范圍為1990~2012,該如何設置呢?作圖語句中提供了選項HAXIS=和選項VAXIS=,可以用來分別設定橫坐標和縱坐標的取值范圍。如:
symbol value=dot cv=red interpol=join ci=blue; proc gplot data=ex.sales_year; title 'Yearly Amount in North America'; plot N_Amount*Year /haxis=1990 to 2012 by 5; run; quit; goptions reset=all;
除了這樣直接定義坐標軸的取值范圍以外,還可以通過AXIS語句 來進行這一操作。AXIS語句除了可以設定坐標軸范圍,還可以對坐標 軸進行更加豐富的設置。
2.使用AXIS語句設置坐標軸屬性
通過AXIS語句可以設定坐標軸的刻度范圍、顏色、描述標簽、每 兩個主刻度中間次刻度的個數等屬性。和SYMBOL語句一樣,AXIS語 句也是全局語句,它也可以用於其他作圖過程中坐標軸的設置。AXIS語句的形式如下:
AXISn 選項;
其中,n是不同AXIS的序號,取值為1~99,缺省時默認取值為1。 SYMBOL語句和TITLE語句一樣是全局語句,可以出現在PROC步前面 或PROC步的程序中間。
將某個AXIS語句恢復為默認設置的方法如下:
AXISn;
將所有AXIS語句都恢復為默認設置的方法如下:
GOPTIONS RESET=AXIS;
在GPLOT過程中使用AXIS語句的形式如下:
PROC GPLOT DATA=數據集; PLOT 縱坐標變量*橫坐標變量 /HAXIS=AXISn VAXIS=AXISm; AXISn 選項; RUN; QUIT;
其中,HAXIS=AXISn指明縱坐標用AXISn語句設定的屬性, VAXIS=AXISm指明橫坐標用AXISm語句設定的屬性,AXISn語句可以 出現在PROC步前面或者PROC步中間。
在以下的連線圖中對橫坐標和縱坐標的主刻度和次刻度進行設定。 示例代碼如下:
axis1 order=(1990 to 2012 by 5) ; axis2 order=(13000 to 20000 by 1000) minor=(color=blue height=0.25 number=1); symbol value=dot cv=red interpol=join ci=blue; proc gplot data=ex.sales_year; title 'Yearly Amount in North America'; plot N_Amount*Year/haxis=axis1 vaxis=axis2; run; quit; goptions reset=all;
在上面的程序中,先通過AXIS語句設置了AXIS1和AXIS2,在 AXIS1中規定坐標軸的取值為1990~2012,每5個點一個主刻度,每個主 刻度中間有一個次刻度,次刻度顯示為藍色,同理還定義了AXIS2。在 PLOT語句中,使用選項HAXIS=AXIS1和VAXIS=AXIS2分別指定了橫 坐標和縱坐標調用AXIS1和AXIS2設置的屬性。
AXIS語句中的選項很多,用法也非常豐富,這里簡單羅列了一些 常用的選項及用法示例
3 制作多幅圖形
前面提到在一個GPLOT過程中可以使用多個PLOT語句,這時每個 語句都可以制作一幅單獨的圖形。其實,使用一個PLOT語句也可以制 作多幅圖形。使用語法如下:
PLOT 縱坐標變量1*橫坐標變量1 縱坐標變量2*橫坐標變量2 < … / 選項>;
繪制北美銷售金額連線圖和歐洲銷售金額連線圖。 示例代碼如下:
axis1 order=(1990 to 2012 by 5) minor=(color=blue number=1); axis2 order=(13000 to 20000 by 1000) minor=(color=blue height=0.25 number=1); symbol value=dot cv=red interpol=join ci=blue; proc gplot data=ex.sales_year; title 'Yearly Amount Series'; plot N_Amount*Year E_Amount*Year/haxis=axis1 vaxis=axis2; run; quit; goptions reset=all;
輸出內容如圖5.31所示。 上述程序制作了兩幅圖,第一幅是由PLOT語句中的N_Amount*Year制作的,第二幅是由E_Amount*Year制作的,兩幅圖上 橫縱坐標的尺度都相同。
為了進行比較,有時需要將多條連線繪制在同一幅圖形中。例如, 為了比較北美和歐洲的銷售及變化趨勢,除了上面的做法,更方便的是 將北美和歐洲的銷售連線圖畫在同一幅圖形中。又如在進行時間序列分 析時,為了比較預測值和實際值的趨勢及大小,也需要在同一幅圖中比較。
在同一幅圖形中繪制多條連線有以下3種方法:
- ·使用選項OVERLAY疊加圖形。
- ·使用PLOT2語句疊加圖形。
- ·使用分組變量制作多條連線圖。 下面將具體介紹每種方法及其使用場景,讀者可以根據具體的數據集選用不同的方法。
1.使用選項OVERLAY疊加圖形(單軸)
使用選項OVERLAY可以將同一個PLOT語句中的多個圖形展現在 同一幅圖形中。
將上例中的兩條連線繪制在同一圖形中。 示例代碼如下:
axis1 order=(1990 to 2012 by 5) minor=(color=blue number=1); axis2 order=(13000 to 20000 by 1000) minor=(color=blue height=0.25 number=1); symbol1 value=dot cv=red interpol=join ci=red; symbol2 value=# cv=green interpol=join ci=green line=4; proc gplot data=ex.sales_year; title 'Yearly Amount Series'; plot N_Amount*Year E_Amount*Year/overlay legend haxis=axis1 vaxis=axis2; run; quit; goptions reset=all;
由於兩個連線在同一圖形中,系統約定由SYMBOL1語句設定第一條連線,SYMBOL2語句設定第二條連線。所以當有多條連線時,應該 以不同序號的SYMBOL語句分別設定相應的連線屬性。
除非特別指定,否則每個SYMBOL語句設定的屬性在一個作圖過程中只使用一次。
當同一圖形中有多條連線時,為了區分連線的含義,需要使用選項 LEGEND添加圖例。上述程序中,通過圖形下方的圖例,可以很清楚地 區分紅線代表北美的銷售額,黃線代表歐洲的銷售額。
2.使用PLOT2語句疊加圖形(雙軸)
使用PLOT2語句可以為其所指定的縱坐標變量在圖的右側設立一條 垂直坐標軸,這樣不同的縱坐標變量就可以使用不同的縱軸尺度。 PLOT2語句的使用方法和PLOT語句一樣。使用語法如下:
PLOT2 縱坐標變量1*橫坐標變量1 <縱坐標變量2*橫坐標變量2 … > </ 選項>;
axis1 order=(1990 to 2012 by 5) minor=(color=blue number=1); axis2 order=(13000 to 20000 by 1000) minor=(color=blue height=0.25 number=1); axis3 major=(number=8) minor=(number=1); symbol1 value=dot cv=red interpol=join ci=red; symbol2 value=diamond cv=green height=2 interpol=join ci=green line=10; proc gplot data=ex.sales_year; title 'Yearly Amount Series'; plot N_Amount*Year /legend haxis=axis1 vaxis=axis2; plot2 N_Transations*Year/legend vaxis=axis3; run; quit; goptions reset=all;
在上述程序中,需要注意以下幾點:
- ·在GPLOT過程中使用PLOT2語句時,必須使用PLOT語句。
- ·如果需要顯示所有圖形的圖例,需要在PLOT語句和PLOT2語句中 都使用選項LEGEND。
- ·使用PLOT2語句,可以使用選項VAXIS=專門設定右邊坐標軸的屬性。
3.使用分組變量制作多條連線圖
前面在介紹疊加圖形時可看到,不同圖形的縱坐標變量都存儲在數 據集中的不同字段下。當縱坐標變量的數據都存儲在數據集中的同一字 段下時,如何制作多條連線圖?這時就需要指定第3個變量,根據第3個 變量的不同取值,在同一幅圖中制作多條連線圖,也稱這第3個變量為 分組變量。其基本語法如下:PLOT縱坐標變量*橫坐標變量=分組變量</選項>;當使用分組變量時,系統默認提供圖例。
數據集ex.sales_year_by_area中是全球4個地區的歷年銷售數量和銷售金額的數據,包含4個變量:年份(Year)、銷售數量(Transactions)、銷售金額(Amount)、地區(Area)。現在要在同 一幅圖中制作多條連線圖展現每個地區歷年銷售金額的情況。
示例代碼如下:
axis1 order=(1990 to 2012 by 5) minor=(color=blue number=1); axis2 minor=(color=blue height=0.25 number=1); symbol value=: height=2 interpol=join; proc gplot data=ex.sales_year_by_area; title 'Yearly Amount Series By Area'; plot Amount*Year=Area/haxis=axis1 vaxis=axis2 ; run; quit; goptions reset=all;
在上述程序中,只使用了一個SYMBOL語句,定義了插值方法、散 點符號和大小,但是沒有指定顏色。因此在圖形中,每條連線都使用了 相同的散點符號,不一樣的顏色。
在SYMBOL語句中沒有指定顏色時,該語句中定義的屬性將被重復使用,顏色按照選項COLORS=中指定的顏色或者系統顏色列表中的顏色依次循環調用。
4.使用LEGEND語句設置圖例屬性
當一幅圖形中有多條連線時,為了辨識每條連線的含義,可在 PLOT語句中使用選項LEGEND在圖形中增加圖例,此時選項LEGEND 使用了默認的方式顯示圖例。這里將介紹如何使用LEGEND語句對圖例 的大小、布局、邊框、位置及圖例中文字的屬性進行更加豐富的設置。
LEGEND語句的使用方法如下:
LEGENDn 選項;
其中n=1~99,默認取值為1。LEGEND語句是全局語句,更新規則 和SYMBOL語句一樣。
將某個LEGEND語句恢復為默認設置的方法如下:
LEGENDn;
取消所有LEGEND語句的方法如下:
GOPTIONS RESET=LEGEND;
在GPLOT過程中繪制多條連線圖時,調用LEGEND語句設置的圖 例屬性的方法如下:
LEGEND=LEGENDn;
將例5.28中的圖例放在連線圖橫坐標下面的中間部分,分兩排排列,並將圖例區加上深藍的邊框和淺藍的陰影。
示例代碼如下:
axis1 order=(1990 to 2012 by 5) minor=(color=blue number=1); axis2 minor=(color=blue height=0.25 number=1); legend1 cborder=blue cshadow=lightblue across=2 position=(bottom center) label= (color=lightpurple height=1.5 font='Courier New' 'Global'); symbol value=: height=2 interpol=join; proc gplot data=ex.sales_year_by_area; title 'Yearly Amount Series By Area'; plot Amount*Year=Area/haxis=axis1 vaxis=axis2 legend=legend1; run; quit; goptions reset=all;
上述程序中使用LEGEND1語句設置了圖例的屬性,並在PLOT語句 中調用了LEGEND1。
4 制作氣泡圖
在GPLOT過程中可以使用BUBBLE語句制作氣泡圖。基本語法如 下:
BUBBLE 縱坐標變量*橫坐標變量=氣泡變量 </ 選項> ;
氣泡圖有3個維度,包括:縱坐標變量、橫坐標變量和氣泡變量, 它們都是數據集中的變量,其中縱坐標變量和橫坐標變量確定氣泡的位 置,氣泡變量確定氣泡的大小,所以氣泡變量必須是數值型變量。
利用數據集ex.sales_year制作氣泡圖,反映歐洲地區歷年的 銷售情況。
示例代碼如下:
axis2 minor=(color=blue height=0.25 number=1); proc gplot data=ex.sales_year; title 'Yearly Sales Overview'; bubble E_Amount*Year=E_Transactions/vaxis=axis2 bcolor=red bsize=12; where year>=1999; run; quit; goptions reset=all;
在上述代碼中縱坐標為銷售金額,橫坐標為年份,銷售數量決定了氣泡的大小,並且在BUBBLE語句使用了選項BCOLOR=和BSIZE=來設 定氣泡的顯示屬性。在圖5.36的方框中,兩個氣泡分別表示2010年和2011年的銷售情況,從銷售金額來看,2011年比2010年有所上升(氣泡 所處的位置升高),從銷售數量來看,2011年比2010年下降了(氣泡的 大小變化),由此可以推斷,單位數量的銷售金額從2010年到2011年提 高了。可見,使用氣泡圖能更加直觀地反映多個維度的信息。