雷达图,也叫网状图、蜘蛛网图、星图、极坐标图、Kiviat图、不规则多边图等,以二维图的形式显示多元数据。通常包括三个或多个定量变量,从同一点开始的轴上表示。轴的相对位置和角度通常是无意义的,不过通常用来揭示相关性、权衡(trade-offs)和比较等等。由坐标、刻度及参考线、多边形和数据点组成,图1。
Fig.1.雷达图解析 (出自The Data Visualisation Catalogue)
在SAS第二代绘图g系列语句里,有专门的PROC gradar语句来完成。功能限制多,图形展示效果较差,想多点花样,必须用注释anno辅助才行。虽然到了SAS第三代绘图sg系列里面没有专门的雷达图语句了,但是SAS官方博客上倒是有几篇文章提到怎么用sg语句组合来绘制雷达图,要完成如图1那样的图不是很困难的事情。
在前一篇文章《SAS程序优化_一万次循环》里面为了展示系统资源使用不均衡的情况,用到了雷达图(图2),表达了磁盘DISK io占用率高,限制了电脑发挥,属于trade-offs。其实这种情况,也可以用条形图展示,不过效果没雷达图好。
Fig.2. 电脑系统资源使用情况示意图
绘图要点:
1,由于不是规则的坐标图,即极坐标图,所以数据得转换,从XY坐标图转换到极坐标图,因此数据要完成角度弧度的转换;
2,只有一个极坐标轴了,坐标轴变成了辐条,可以用sgplot vector来完成;坐标轴上的刻度及参考线可以用polygon画多边形或ellipseparm画圆完成;数据点用scatter完成;数据点之间的连线用polygon多边形来完成;
3,还剩下一个坐标轴的命名,默认是datalabel,名称的位置受限,经常与部分刻度参考线重叠,非常难看,gradar也无法避免这个问题,除非借助anno,相当的难受,sgplot text就可以非常愉快的完成这个,做到美观大方。
代码组成部分一:作图数据
- data ex;
- do situation = 1 to 0 by –1;
- input cpu memory disk gpu network;output;
- end;
- cards;
- 20 20 90 10 10
- 50 50 50 50 50
- ;
- run;
- proc sort data=ex out=ex;by situation;run;
- proc transpose data=ex out= ex2 name=config prefix= use ;
- by situation;
- run;
如果你的数据已经是图3这样了,就无需上面转换。
Fig.3. 期望的实际数据形式
代码组成部分二:构造极坐标图框架和数据,转换的数据形式见图4。
- data ex3;
- set ex2;
- deg2Rad = constant(‘pi’)/180 ;
- deg =(90–360/5*(_N_-1)) ; /* 5由变量个数来决定 */
- angle = deg*deg2Rad ;
- rangle = –360/5*(_N_-1) ;/* 5由变量个数来决定 */
- rdx = use1*cos(angle) ;
- rdy = use1*sin(angle) ;
- rx = 100*cos(angle); ry=100*sin(angle);/*100由实际情况定 */
- config=upcase(config);
- if situation then situ_=”实际情况” ;else situ_=”理性情况”;
- run;
Fig.4. 转换的实际数据和构图数据形式
代码组成部分三:作图
- ods listing image_dpi=600 gpath=”d:” ;
- ods graphics on / imagename=”Figure_” HEIGHT= 7 cm WIDTH= 7 cm border=no ;
- footnote;
- title;
- proc sgplot data=ex3 ASPECT=1 noborder SUBPIXEL;
- STYLEATTRS DATACONTRASTCOLORS=(blue red);
- polygon x=rdx y=rdy id=situation/ group=situ_ outline LINEATTRS=(pattern=solid color=blue THICKNESS=2) fill fillattrs=(transparency=0.) name=”sxlion”;
- vector x=rx y=ry / xOrigin=0 yOrigin=0 NOARROWHEADS LINEATTRS=(pattern=solid color=black THICKNESS=1.5) ;
- text x=rx y=ry text=config / ROTATE=rangle position=top textattrs= (Color=darkblue Family=”Helvetica” Size=10 Weight=Bold);
- ellipseparm SEMIMAJOR=50 SEMIMINOR=50;/*中刻度线,自定*/
- ellipseparm SEMIMAJOR=99 SEMIMINOR=99;/*外刻度线,自定*/
- scatter x=rdx y=rdy /markerattrs=(symbol=circlefilled color=red Size=6);
- keylegend “sxlion” / noborder;
- xaxis DISPLAY=none;
- yaxis DISPLAY=none;
- run;
- ods graphics off;
SAS绘图sg系列语句可以模块化,多个功能叠加在一起就可以组成一个雷达图了。当然,既然是组合,只要兼容的sg系列语句都可以叠加在一起,并且按语句出现的先后顺序叠加起来,语句的前后顺序可根据需要进行安排。
期待polygon语句的smoothconnect选项早日生效,这样多边形可以用光滑的曲线连接了,图像更活泼了。