日本一意孤行?国际原子能机构认为福岛处理水排海计划符合国际安全标准

普里戈津之死!我的三点评论!

从人类历史,看人类未来

目录一览!马工程重点教材《习近平新时代中国特色社会主义思想概论》

从福岛核废水说起:我们是在谈科学还是讲立场

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

精雕细琢:一图看尽丑小鸭变白天鹅全过程,手把手教你SAS画图哦!

谷鸿秋 统计札记 2023-02-24

为了忽悠你们进来,取了这个长一个名字,我也是醉了。这是你没见过的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;



4. 调色


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」获取白名单权限。

  • 其他平台转载,不得省略作者信息,包括公众号二维码。



文章有问题?点此查看未经处理的缓存