精雕细琢:一图看尽丑小鸭变白天鹅全过程,手把手教你SAS画图哦!
为了忽悠你们进来,取了这个长一个名字,我也是醉了。这是「你没见过的SAS绘图系列教程」第四次推送,也有可能是最后一次推送。如果你是第一次看到此文,不明就里,请先戳前三次推送:
前几次的推送,引来不少喝彩,当然,也引来更多质疑和争议。总有人质疑前面的图不是出自SAS之手,好吧,今天就一步一步来吧,各位看官,请看好!
今天的成品图就是下面这位。有人肯定要惊讶、愤怒的跳出来说,这肯定ggplot2的成品啊,R里的diamond数据啊。好吧,我们来用SAS玩一下。
我把diamond数据导出了,懒得倒腾的可以回复「Diadata」获取。我们导入数据,排序。
proc import out=diamonds datafile="D:\diamonds.csv"
dbms=csv replace;
run;
proc sort data=diamonds;
by color;
run;
好的,下面我们一步一步来重现。
1. 原型图
用前面所讲的,sgplot的scatter语句加group选项即可画图原型图。
Proc sgplot data=diamonds ;
scatter x=carat y=price/group=color ;
run;
仔细观察,SAS默认图片和ggplot2的差距主要表现在:
边框,SAS图片默认在两层方框中
符号,SAS默认符号是空心圆圈
颜色,默认配色特别晦涩老陈
坐标轴,中规中矩
图例,默认在下方
底色,白背景
下面,我一个一个的解决,并查看叠加效果。每次的差距用加粗的代码标示。
2. 边框
SAS图片默认有两层边框,最外层的边框可以通过 ods 选项noborder解决,里层边框可以通过sgplot过程的选项noborder解决。
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
scatter x=carat y=price/group=color ;
run;
去里层边框效果
去里层+去外层边框效果
3. 图形符号
SAS的图形符号可以通过styleattrs 语句来修改。我们设置为datasymbols=circlefilled。
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
styleattrs datasymbols=(circlefilled);
scatter x=carat y=price/group=color ;
run;
SAS的默认配色,只能说是太保守,太晦涩,太陈旧......,不得不佩服HadleyWickham的配色是如此清新明快。模仿一下他的配色,我们指定styleattrs语句的 datacontrastcolors值。
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
styleattrs datacontrastcolors=(CXF8766D CXC49A00 CX53B400 CX00C094 CX00B6EB CXA58AFF CXFB61D7 ) datasymbols=(circlefilled);
scatter x=carat y=price/group=color markerattrs=(size=3);
run;
再看看下面这图,是不有点感觉啦!丑小鸭变形记开始。
5. 数轴
把那死板的数轴改改,用xaxis 和yaxis语句。
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
styleattrs datacontrastcolors=(CXF8766D CXC49A00 CX53B400 CX00C094 CX00B6EB CXA58AFF CXFB61D7 ) datasymbols=(circlefilled);
scatter x=carat y=price/group=color markerattrs=(size=3);
xaxis grid display=(noline ) ;
yaxis grid display=(noline) ;
run;
哎,小天鹅是否出具雏形了?
6. 图例
再用keylegend语句对图例做点小手脚。
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
styleattrs datacontrastcolors=(CXF8766D CXC49A00 CX53B400 CX00C094 CX00B6EB CXA58AFF CXFB61D7 ) datasymbols=(circlefilled);
scatter x=carat y=price/group=color markerattrs=(size=3);
xaxis grid display=(noline ) ;
yaxis grid display=(noline) ;
keylegend / position=right across=1 noopaque noborder;
run;
现在看来,只差底板了。
7. 底板
还记得上次推送中第一个Proc template里的定义的StyleS.R嘛,对了,就是她,这是幕后的英雄。指定style为Styles.R,大功告成了。
ods html style=styleS.R;
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
styleattrs datacontrastcolors=(CXF8766D CXC49A00 CX53B400 CX00C094 CX00B6EB CXA58AFF CXFB61D7 ) datasymbols=(circlefilled);
scatter x=carat y=price/group=color markerattrs=(size=3);
xaxis grid display=(noline ) ;
yaxis grid display=(noline) ;
keylegend / position=right across=1 noopaque noborder;
run;
Styles.R
当然,这个和最终的ggplot2的还是有区别的。这个就留给处女座的童靴啦。
install.packages("ggplot2")
library(ggplot2)
qplot(carat, price, data = diamonds, color= color)
ggplot2 成品
当然,除了我们自定义的Style,SAS其实也为我们定义了一些Style,默认的是HTMLBULE,其他一些Style其实我个人感觉还是挺丑的,不过对于一些学术期刊,彩色图片还得另外收费,于是journal这个style就挺有用了。
ods html style=journal2;
ods graphics on/noborder;
Proc sgplot data=diamonds noborder;
scatter x=carat y=price/group=color markerattrs=(size=3);
xaxis grid display=(noline ) ;
yaxis grid display=(noline) ;
keylegend / position=right across=1 noopaque noborder;
run;
journal style
最后,其实还有一些问题:比如图片名称,格式,大小,分辨率,以及保存位置。这些也都可以设置下。
8. 图片名称,格式,大小,分辨率,以及保存位置
图片名称,格式,大小主要在ODS Graphics语句的选项里设置,分辨率,保存位置主要在ODS html语句里设置。
ods html style=styleS.R gpath="D:\" dpi=200;
ods graphics on/noborder height=5in width=8in imagename="diamond" outputfmt=JPEG;
Proc sgplot data=diamonds noborder;
styleattrs datacontrastcolors=(CXF8766D CXC49A00 CX53B400 CX00C094 CX00B6EB CXA58AFF CXFB61D7 ) datasymbols=(circlefilled);
scatter x=carat y=price/group=color markerattrs=(size=3);
xaxis grid display=(noline ) ;
yaxis grid display=(noline) ;
keylegend / position=right across=1 noopaque noborder;
run;
最后,有朋友问,这么折腾,R的ggplot2的俩三行代码就可以解决的问题,为什么要倒腾SAS,这样有何优势?
我的想法是:R的ggplot2的确很有优势。我写这个,一是,纯粹为了好玩。二是,对一个已经熟悉了SAS做统计分析,但畏惧SAS画图的统计人员来说,他不必再在两个软件间倒腾数据了。此外,如果你行业里的同行也都在用SAS代码绘图,大家都用同一套语言,交流成本是否更低?当然,这只是我不成熟的一点看法。
终于在春节前写完了「你没见过的SAS绘图系列教程」,我是多么敬业的原创公众号写作者啊。
版权说明:
感谢支持鼓励,形式包括不限于转发,转载,推荐,打赏。
微信公众平台转载,请发邮件至「guhongqiu(at)yeah(dot)net」获取白名单权限。
其他平台转载,不得省略作者信息,包括公众号二维码。