通过GPLOT过程制作图形
通过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年提 高了。可见,使用气泡图能更加直观地反映多个维度的信息。