用SAS实现不等比例扇形的南丁格尔玫瑰图

有朋友看到上一篇文章: 用SAS实现堆积式南丁格尔玫瑰图Nightingale Rose Diagram (上),然后就自己改造了一下,因为他的数据中并不是等比例的,因此对应的饼图并不是等比例的,不过由于对那段SAS代码理解不深,因此出现了错误。

后来我帮忙修正了下代码,照样也很好用。图如下:

 

主要问题在下段代码,需要构造不等角度的pie:

data pies;

set ex2;

by index;

length style function color $ 12;xsys=’3′; ysys=’3′; hsys=’3′;x=50; y=50; /* 定位圆心 */

function = ‘PIE’;

style = ‘SOLID’;

if first.index then do sizev = value;

end;else do ; sizev + value; end;size=(&radius.*((sizev+40)/100)); /*最大半径为 &radius% */

angle = 10;angle =angle + (ang0/100)*360;     /*  起始的角度        */

rotate = (pct/100)*360;           /* 从开始到结束的角度 */
color=col;

output;

run;

一旦构造好合适的数据以后,就OK了。

下面即是实现上图的全部代码(好像下面格式变了),还可以直接到这里下载即可运行:

%let name=rose3;
FILENAME file "c:\";
data color;
input fundcode $ 8-13 col $ 1-8;
col="CX"||col;
cards;
BACAE2 600003
8F9CA8 700009
2D4978 840008
637798 940007
8395BB 040016
BACAE2 140011
8F9CA8 240005
8395BB 340001
BACAE2 440015
8F9CA8 540004
8395BB 640019
BACAE2 740012
8F9CA8 840009
2D4978 940180
637798 010190
8395BB 140002
BACAE2 210180
8F9CA8 340190
375299 440018
353535
B3B3B3 540003
;
run;
data ha_rose;
input FUNDcode $8. FUNDtype $12. FUND_TY_PCT FUND_HA_PCT FUND_TY_TOT FUND_TY_RANK;
cards;
600003 封闭式基金   8.03 39.92 2 2
700009 封闭式基金   8.03 60.08 2 1
840008 股票型基金   27.16 38.96 5 1
940007 股票型基金   27.16 28.20 5 3
040016 股票型基金   27.16 2.68 5 4
140011 股票型基金   27.16 1.41 5 5
240005 股票型基金   27.16 28.75 5 2
340001 混合型基金   10.32 64.20 3 1
440015 混合型基金   10.32 8.81 3 3
540004 混合型基金   10.32 26.99 3 2
640019 债券型基金   4.56 64.98 3 1
740012 债券型基金   4.56 10.84 3 3
840009 债券型基金   4.56 24.18 3 2
940180 指数型基金   13.27 6.18 5 5
010190 指数型基金   13.27 6.95 5 4
140002 指数型基金   13.27 38.81 5 1
210180 指数型基金   13.27 37.33 5 2
340190 指数型基金   13.27 10.73 5 3
440018 QDII         5.08 100.00 1 3
保本基金     4.03 100.00 1 4
短债基金     2.02 100.00 1 5
540003 货币市场基金 6.01 100.00 1 2
配置型基金   19.51 100.00 1 1
;
run;
proc print;run;

proc sql;
create table ex as select a.col,b.fundtype as index,b.FUND_TY_PCT as pct,b.FUND_HA_PCT as value
from HA_ROSE b right outer join color a
on a.fundcode=b.fundcode;
quit;

proc sort data=ex;
by index;
run;

/*构造控制绘图参数 PIE函数的半径rad,起始角和角度ang */
data ex2 (where=(ang0 ne .));
set ex nobs=max;
by index;
retain rad ang ang0 0;
if first.index then
do ; rad=1;ang+pct; ang0=lag(ang);output; end;
else do; rad+1;output; end;
/*if _N_=max then do; call symput("piece", ang); end;*/
/*%put &piece.;*/
if _N_=1 then do ; ang0=0; output;end;
run;

/*设置最大饼环的半径为整个图的百分比*/
%let radius=25;

data pies; set ex2;
by index;
length style function color $ 12;
xsys='3'; ysys='3'; hsys='3';
x=50; y=50; /* 定位圆心 */
function = 'PIE';
style = 'SOLID';
if first.index then do sizev = value; end;
else do ; sizev + value; end;
size=(&radius.*((sizev+40)/100)); /*最大半径为 &radius% */

angle = 10;
angle =angle + (ang0/100)*360; /* 起始的角度 */
rotate = (pct/100)*360; /* 从开始到结束的角度 */

color=col;
output;
run;
proc sort data=pies out=pies;
by index decending sizev;
run;

/* 中心空白圆 */
data hole1; set ex2;
length style function color $ 12;
xsys='3'; ysys='3'; hsys='3';
x=50;
y=50;
function='PIE';
style='SOLID';
angle=0;
line=1;
rotate=360;
size=(&radius.*((39)/100));
color='CX2F3338';
output;
run;

data hole2; set ex2;
length style function color $ 12;
xsys='3'; ysys='3'; hsys='3';
x=50;
y=50;
function='PIE';
style='SOLID';
angle=0;
line=1;
rotate=360;
size=(&radius.*((36)/100));
color='CX415D8E';
output;
run;

/* 天 使 圈 */
data circle1; set ex2;
length style function color $ 12;
xsys='3'; ysys='3'; hsys='3';
x=50;
y=50;
function='PIE';
style='SOLID';
angle=0;
line=1;
rotate=360;
size=(&radius.*((148)/100));
color='CX2E2E2E';
output;
run;
data circle2; set ex2;
length style function color $ 12;
xsys='3'; ysys='3'; hsys='3';
x=50;
y=50;
function='PIE';
style='SOLID';
angle=0;
line=1;
rotate=360;
size=(&radius.*((145)/100));
color='CX232323';
output;
run;

/* 饼周围的外线 */
data outlines; set pies hole1;
style='EMPTY';
color="CX6C6C6C";
line=3;
run;

/* 标注每个 PIE */
data slices; set pies; by index;
if first.index then output;
run;
data slices; set slices;
length text $10;
/* 定位到PIE的正上方的角度 */
function='piexy'; angle=angle+rotate*.5;
/* 定位到PIE的正上方的位置距离 */
size=5; output;
/* 转换坐标 */
function='cntl2txt'; output;
/* 在定义好的地方进行标注 */
function='label'; text=index||index||index; angle=0; rotate=0; color='CX776122';
style='"simsun/bo"'; size=3; x=.; y=.; position='5';
output;
run;

/* 标注中心 地方 */
data center;
length style function color $ 12;
length text $12;
xsys='3'; ysys='3'; hsys='3';
x=50;
y=50;
function='LABEL';
color='CXF1F9FF';
text='神龙基金';
position='B';
style='"Fsong"'; size=4.5;
output;
run;

/*data anno; set circle1 circle2 center pies outlines hole1 hole2 slices ; run;*/

data anno; set circle1 circle2 center pies outlines hole1 hole2 slices; run;

ODS LISTING close ;

ODS HTML path=file body="&name..htm" ;
goptions reset=all noborder CHARTYPE=8
xpixels=3000 xmax=3in ypixels=3000 ymax=3in
device=JPEG300 gsfname=file cback=CX242424;

proc ganno annotate=anno name="&name"; ;
run;

quit;

ods HTML CLOSE;
ODS LISTING ;

 

 

 

 

 

 

 

《用SAS实现不等比例扇形的南丁格尔玫瑰图》上有3条评论

  1. sxlion兄的图真是画的出神入化,在下真得好好学习了~~呵呵!

    1. 哈哈,SAS绘图能力可谓是超乎大家都想象啊,我还需继续努力学习钻研。

发表评论

电子邮件地址不会被公开。 必填项已用*标注