逆水行舟,不进则退

纸上得来终觉浅,绝知此事要躬行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

南丁格尔玫瑰图在游戏运营分析报表中的应用

Posted on 2013-11-29 19:36  Jonee  阅读(897)  评论(0编辑  收藏  举报

取统计时间区间内一天24个小时时间段的平均在线人数来作图。

数据如下:

程序如下:

%let name=game;
FILENAME file "Y:\"; 

data demo;
    input ID time $ value col$ @@;
    col="CX"||col;
    value=value/100;
cards;
5 0h~1h 6377 16A629 5 0h~1h 3623 C0C0C0
4 1h~2h 2024 16A629 4 1h~2h 7976 C0C0C0
3 2h~3h 300 16A629 3 2h~3h 9700 C0C0C0
2 3h~4h 899 16A629 2 3h~4h 9101 C0C0C0
1 4h~5h 636 16A629 1 4h~5h 9364 C0C0C0
24 5h~6h 561 16A629 24 5h~6h 9439 C0C0C0
23 6h~7h 3919 16A629 23 6h~7h 6081 C0C0C0
22 7h~8h 4022 16A629 22 7h~8h 5978 C0C0C0
21 8h~9h 6531 16A629 21 8h~9h 3469 C0C0C0
20 9h~10h 6043 16A629 20 9h~10h 3957 C0C0C0
19 10h~11h 7669 16A629 19 10h~11h 2331 C0C0C0
18 11h~12h 7834 16A629 18 11h~12h 2166 C0C0C0
17 12h~13h 492 16A629 17 12h~13h 9508 C0C0C0
16 13h~14h 3228 16A629 16 13h~14h 6772 C0C0C0
15 14h~15h 1177 16A629 15 14h~15h 8823 C0C0C0
14 15h~16h 3407 16A629 14 15h~16h 6593 C0C0C0
13 16h~17h 5647 16A629 13 16h~17h 4353 C0C0C0
12 17h~18h 1860 16A629 12 17h~18h 8140 C0C0C0
11 18h~19h 8955 16A629 11 18h~19h 1045 C0C0C0
10 19h~20h 9371 16A629 10 19h~20h 629 C0C0C0
9 20h~21h 8243 16A629 9 20h~21h 1757 C0C0C0
8 21h~22h 8336 16A629 8 21h~22h 1664 C0C0C0
7 22h~23h 8865 16A629 7 22h~23h 1135 C0C0C0
6 23h~24h 9478 16A629 6 23h~24h 522 C0C0C0
;
run;

proc sort data=demo;by id;run;

/*构造控制绘图参数 PIE函数的半径rad,起始角和角度ang */
data demo2;
    set demo nobs=max;
    by id;
    retain rad ang 0;
    if first.id then do;
        rad=1;
        ang+1; 
        output; 
    end;
    else do; 
        rad+1;
        output; 
    end;
    if _N_=max then do; 
        call symput("piece", ang); 
    end;
run;

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

data pies;
    set demo2;
    by id;
    length style function color $ 12;
    xsys='3'; ysys='3'; hsys='3';
    x=50; y=50; /* 定位圆心 */
    function = 'PIE';
    style = 'SOLID';
    if first.id then do ;
        sizev = value; 
    end;
    else do ; 
        sizev + value; 
    end;
    size=(&radius.*((sizev+40)/100)); /*最大半径为 &radius% */
    angle = 10;
    angle =angle + ((ang-1) / &piece.)*360;
    rotate = (1/ &piece.)*360;
    color=col;
    output;
run;

proc sort data=pies out=pies;
    by id decending sizev;
run;

/* 中心空白圆 */
data hole1; 
    set demo2;
    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 demo2;
    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 demo2;
    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 demo2;
    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 id;
    if first.id then output;
run;

data slices(drop=_value_); 
    set slices;
    length text $20;
    /* 定位到PIE的正上方的角度 */
    function='piexy'; 
    angle=angle+rotate*.5;
    /* 定位到PIE的正上方的位置距离 */
    size=5; 
    output;
    /* 转换坐标 */
    function='cntl2txt'; 
    output;
    /* 在定义好的地方进行标注 */
    function='label'; 
    _value_=(sizev-value)*100;
    text=cats(time,"(",_value_,")"); 
    angle=0; rotate=0; color='CX776122';
    style='"arial/bo"'; size=1.5; x=.; y=.; position='5';
    output;
run;

/* 标注中心 地方 */
data center;
    length style function color $ 12;
    length text $20;
    xsys='3'; ysys='3'; hsys='3';
    x=50;
    y=50;
    function='LABEL';
    color='CXF1F9FF';
    text='Jonee';
    position='B';
    style='"arial/bo"'; size=3.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
xpixels=4000 xmax=3in ypixels=4000 ymax=3in
device=JPEG300 gsfname=file cback=CXF1F1F1;

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

ods html close;
ods listing;

输出结果:

通过确定一天24个小时时间段内哪个时间段的在线人数较少,就可以在最大限度避免影响玩家游戏体验的情况下进行服务器升级、合服之类的工作。