msgbartop
List for SAS fans and programmer
msgbarbottom

23 5月 20 雷达图及SAS绘图 by sxlion

雷达图,也叫网状图、蜘蛛网图、星图、极坐标图、Kiviat图、不规则多边图等,以二维图的形式显示多元数据。通常包括三个或多个定量变量,从同一点开始的轴上表示。轴的相对位置和角度通常是无意义的,不过通常用来揭示相关性、权衡(trade-offs)和比较等等。由坐标、刻度及参考线、多边形和数据点组成,图1。

radar chart

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   =(90360/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系列语句都可以叠加在一起,并且按语句出现的先后顺序叠加起来,语句的前后顺序可根据需要进行安排。

原创文章: ”雷达图及SAS绘图 by sxlion“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/475